Я пытаюсь написать довольно простую грамматику с PLY (реализация yacc на Python) , и у меня возникают проблемы с получением yacc
для сокращения строк токенов, когда я этого хочу.
Я хочу интерпретировать серию команд, которые принимают разные типы аргументов.Каждый вид аргумента имеет свой токен.Строка токенов, которая выходит из lex
, может выглядеть так:
COMMAND VARARG VARARG STRARG
COMMAND VARARG STRARG STRARG
Я хочу, чтобы yacc
превратил каждую из этих строк в правило, называемое instruction
.Однако yacc
отказывается прекратить сокращать первую строку после последнего аргумента (STRARG
) и генерирует синтаксическую ошибку из-за неожиданного токена COMMAND
.
То есть вместо уменьшения COMMAND VARARG VARARG STRARG
на instruction
, yacc
сдвигается еще раз, чтобы получить COMMAND VARARG VARARG STRARG COMMAND
(поднимая последнюю COMMAND
со следующей строки, которая не должна была читаться).
Часть yacc
моего кода выглядит следующим образом:
def p_rule1(p):
r'instruction : COMMAND VARARG VARARG STRARG'
# do stuff
def p_rule2(p):
r'instruction : COMMAND VARARG STRARG STRARG'
# do other stuff
Я делаю некоторые очевидные ошибки в спецификации моего правила?Я впервые использую lex
/ yacc
, поэтому я не удивлюсь.