Как написать правило чтения двух строк с помощью парсера rply? - PullRequest
0 голосов
/ 08 мая 2020

У меня возникают проблемы с написанием правила, которое может читать более одной строки кода в моем анализаторе.

когда я печатаю одну строку, результат в порядке, однако я получаю сообщение об ошибке, если пытаюсь напечатайте две строки.

raise ParsingError(None, lookahead.getsourcepos())
rply.errors.ParsingError: (None, SourcePosition(idx=12, lineno=2, colno=1))

Я следую решению, опубликованному на ( Как анализировать многострочный код с помощью библиотеки RPLY? ), но я не думаю, что понимаю ответ правильно. Я дважды изменил свой код ast.py и получил две разные ошибки

parse_gen.py

        @self.pg.production('expression : PRINT OPEN_PAREN expression CLOSE_PAREN')
        @self.pg.production('program : expression')
        @self.pg.production('program : program expression')

        def program(p):
            return Program(p)
            return Print(p[2])

ast.py

class Program():
    def __init__(self, value):
        self.value = value

    def eval(self):
        self.value.eval()

ошибка 1

AttributeError: 'list' object has no attribute 'eval'

ast.py

class Program():
    def __init__(self, value):
        self.value = value

    def eval(self):
        x = self.value
        for i in x:
            return i.eval()

error 2

AttributeError: 'Token' object has no attribute 'eval'

Я также попытался добавить a для l oop для p в программной функции, но это также вызывает вторая ошибка.

1 Ответ

1 голос
/ 08 мая 2020

Думаю, вам не хватает одной важной вещи, так это правила, по которому RPLY решает, какой нетерминал представляет ввод, который вы хотите проанализировать. Это «начальный нетерминал», и он действительно прост: RPLY (как и почти все генераторы парсеров) просто использует первый нетерминал, который он видит определенным.

В вашем случае , это будет expression, поэтому вы получите синтаксический анализатор, который анализирует (одно) выражение. Кажется очевидным, что вам нужен был program, который анализирует всю программу (из нескольких выражений).

Это правда, что в документации RPLY жалко не хватает деталей, хотя документация, на которую она ссылается (PLY и Bison, насколько я помню) более сложен, и все эти генераторы используют один и тот же алгоритм синтаксического анализа (по умолчанию). Чтобы использовать RPLY, вам необходимо провести дополнительные исследования. Но это цена, которую вы платите за выбор плохо документированного продукта; вы можете использовать другой генератор парсеров.

...