yacc не удается уменьшить (Python Lex-Yacc) - PullRequest
1 голос
/ 02 февраля 2011

Я пытаюсь написать довольно простую грамматику с 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, поэтому я не удивлюсь.

1 Ответ

1 голос
/ 03 февраля 2011

Вам нужно включить дополнительные правила для обработки нескольких инструкций, чтобы yacc знал, что делать со вторым токеном COMMAND.Должно работать что-то вроде ниже.

instructions : instructions '\n' instruction
             | instruction

instruction : COMMAND VARARG VARARG STRARG
            { do stuff }
            | COMMAND VARARG STRARG STRARG
            {do other stuff }

См. http://luv.asn.au/overheads/lex_yacc/yacc.html#recusive

...