Грамматика, в крайнем случае, выглядит следующим образом:JavaCC»LOOKAHEAD (AllSymbols()) AllSymbols() не выбран, единственный, который будет обработан правильно
Phi ::= Phi_sub (("&&" | "||") Phi_sub)*
Phi_sub ::= "(" Phi ")" | ...
Psi ::= Psi_sub (("&&" | "||") Psi_sub)*
Psi_sub ::= "(" Psi ")" | ...
Xi ::= LOOKAHEAD(Phi) Phi | LOOKAHEAD(Psi) Psi
Как вы можете видеть, бесконечные опережения бы в вообще может потребоваться в производстве Си, потому что синтаксический анализатор должен различать случаи, как:
((Phi_sub && Phi_sub) || Phi_sub)
против ((Psi_sub && Psi_sub) || Psi_sub)
т.е. произвольного количества префиксов (
.
Я подумал, что создание взгляда, подобного выше, будет работать, но это не так. Например, Phi выбирается, даже если Xi не расширяется до Phi, а относится к Psi. Это можно легко проверить на определенном потоке S, вызвав Phi с отладчиком сразу после того, как разобранный решил в Xi выбрать Phi и собирается позвонить Phi. Отладчик в таком случае показывает правильное расширение Psi, позволяя парсеру просто вызвать Phi, поскольку он хочет, приведет к исключению синтаксического анализа.
Другой способ тестирования является перекачка Phi и Psi:
Xi ::= LOOKAHEAD(Psi) Psi | LOOKAHEAD(Phi) Phi
Это заставит анализатор разобрать конкретный S правильно, и поэтому кажется, что просто первая ветвь в Xi выбрана, будь то действительный или нет.
Наверное, у меня есть некоторые основные предположения, но не знаю, что это может быть. Должно ли вышеуказанное работать в целом, если нет никаких дополнительных факторов, таких как игнорируемый внутренний взгляд?
Спасибо, так что теперь я знаю , что проблема, скорее всего, игнорируется внутренним взглядом. Я либо (i) попытаюсь присоединиться к Phi и Psi в одно производство, а затем семантически проверить, является ли Phi Phi и Psi Psi, или (ii) переписать грамматику в другом генераторе парсера. – arataj
Синтаксические спецификации просмотра игнорируются во время синтаксического просмотра. См. Обсуждение в FAQ. Это то, чего я никогда не понимал. Если вы опубликуете полный минимальный пример неудачи в качестве нового вопроса, кто-то может понять его. –