У меня есть следующая неоднозначная грамматика, где правила заглавной буквы, являются для простых лексических маркеров:Где двусмысленность в моей грамматике?
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
?
Просто из любопытства; почему вы используете PLY (построен на старых Lex и Yacc) вместо Flex и Bison? – nic
@nic Я более удобен в Python, в отличие от C. Поскольку это моя первая грамматика, я думал, что должен оставаться в домашних водах. Существуют ли огромные преимущества для использования Flex/Bison? – sdasdadas
Flex считается значительно быстрее, чем Lex (хотя lexing - это быстрая задача, как это было бы хорошо знать) и выпущена под лицензией Berkeley (Lex выпущен под некоторыми лицензиями AT & T). Bison, я считаю, является более стабильны, чем Yacc. Странно, что PLY построена на старых версиях. Я думаю, что для просто играть в L & Y так же хорошо, как и для F & B, и если вам нужно легко сделать этот переключатель. – nic