У меня есть файл lex
с моими правилами, такими как:
PROGRAM return Parser::PROGRAM;
PROGRAM_END return Parser::PROGRAM_END;
VARIABLES: return Parser::VARIABLES;
INSTRUCTIONS: return Parser::INSTRUCTIONS;
SKIP return Parser::SKIP;
. {
std::cerr << lineno() << ": ERROR." << std::endl;
exit(1);
}
и когда я пытаюсь использовать полностью скомпилированную (с файлом yacc
и т. д.) версию, то в тестовом файле используется только это, последнее правило, даже если тестовый файл правильный.
Например, это тестовый файл для этих правил:
PROGRAM fst
INSTRUCTIONS:
SKIP
PROGRAM_END
Для этого файла я получил только: 1: ERROR
.
Почему это так и как я могу это решить?
<
,<=
или>
, вы ошибаетесь в том, что используется только последнее правило, либо в вашем реальном коде происходит что-то еще, что не видно в опубликованных вами выдержках. Невозможно сказать, не видя минимально воспроизводимый пример. - person sepp2k   schedule 09.11.2019PROGRAM
не работает в этом примере? Если вы добавите оператор печати к этому правилу, я уверен, что вы увидите его вывод. В любом случае, вам, вероятно, не следует выходить из программы на неизвестных символах, если вы хотите, чтобы она все еще что-то делала (кроме выхода с сообщением об ошибке) для ввода, содержащего неизвестные символы. Я также предлагаю напечатать оскорбительный ввод в правиле.
. - person sepp2k   schedule 09.11.2019yacc
должен печатать каждое перехваченное правило. Если я печатаю сYYText()
, то тоже ничего:1: ERROR:
- person Farm Éva   schedule 09.11.2019.
, тоyacc
напечатает все, но это правило не будет правильным и также позволит использовать плохие файлы. - person Farm Éva   schedule 09.11.2019PROGRAM
, я вижу вывод оператора печати (за которым следует сообщение об ошибке и программа завершается). Мне трудно поверить, что ты этого не сделаешь. - person sepp2k   schedule 09.11.2019fst
илиINSTRUCTIONS
и так далее не появятся в качестве вывода. И еще, файлyacc
должен это поймать и распечатать, но он этого не делает. - person Farm Éva   schedule 09.11.2019exit
в правиле.
. Таким образом, после выполнения правила.
больше ничего не произойдет. Если вы этого не хотите, не звонитеexit
. - person sepp2k   schedule 09.11.2019fst
должен быть перехвачен правилом({CHAR}|{UNDERSCORE})
и макросамиCHAR [a-zA-Z]
UNDERSCORE "_"
. - person Farm Éva   schedule 09.11.2019.
. Я не могу сказать вам, какие правила отсутствуют в вашем реальном коде, потому что я не видел вашего реального кода, но я могу сказать вам, что в вашем примере первым неизвестным символом будет пробел междуPRORGAM
иfst
. - person sepp2k   schedule 09.11.2019