1

У меня есть следующая неоднозначная грамматика, где правила заглавной буквы, являются для простых лексических маркеров:Где двусмысленность в моей грамматике?

program : function | function program 
function : FN ID ARROW TYPE invariants DASH block 
fn_call : ID L_PAREN CONSTANT R_PAREN 


invariants : invariant | invariant invariants 
invariant : TYPE ID COLON invariant_tests 
invariant_tests : test | test COMMA invariant_tests 
test : OPERATOR CONSTANT | STAR 


block : expression | expression block 
expression : loop | fn_call | assignment | def | constant 
loop : FOR def IN CONSTANT COLON block 
assignment : ID ASSIGN CONSTANT | ID ASSIGN ID 
def : TYPE assignment 

Я получаю 8 сдвиг/уменьшить количество ошибок (при использовании Python 2.7 и PLY).

Является ли двусмысленность результатом того, как я определяю «один или несколько», например. block : expression | expression block?

+1

Просто из любопытства; почему вы используете PLY (построен на старых Lex и Yacc) вместо Flex и Bison? – nic

+1

@nic Я более удобен в Python, в отличие от C. Поскольку это моя первая грамматика, я думал, что должен оставаться в домашних водах. Существуют ли огромные преимущества для использования Flex/Bison? – sdasdadas

+1

Flex считается значительно быстрее, чем Lex (хотя lexing - это быстрая задача, как это было бы хорошо знать) и выпущена под лицензией Berkeley (Lex выпущен под некоторыми лицензиями AT & T). Bison, я считаю, является более стабильны, чем Yacc. Странно, что PLY построена на старых версиях. Я думаю, что для просто играть в L & Y так же хорошо, как и для F & B, и если вам нужно легко сделать этот переключатель. – nic

ответ

0

Как сказал предыдущий оратор, вы должны различать «использование блоков». Например, попробуйте:

loop : FOR def IN CONSTANT COLON block END FOR 
+1

Предыдущий оратор был мной, но поскольку я не могу принять свой ответ в течение нескольких дней, я приму ваш правильный ответ. Благодаря! – sdasdadas

0

Проблема заключалась в том, как я определил loop:

loop : FOR def IN CONSTANT COLON block

поскольку анализатор не понял, если блок принадлежал к петле или функции.

В принципе, еще один вариант проблемы с болтающимся другом.

Смежные вопросы