Получить строку вывода с помощью Rply throws ParserGeneratorError: Ожидается: - PullRequest
0 голосов
/ 06 февраля 2020

Попытка реализовать синтаксический анализатор, используя rply, как и ply

#Input = ['ABC']
lg = LexerGenerator()
lg.add('String', r'\D')

l = lg.build()
for token in l.lex('ABC'):
  print(token)

Сгенерированный Lexer по коду выше

class String(BaseBox):
  def __init__(self, value):
    self.value = value 
  def eval(self):
    return self.value


from rply import ParserGenerator
pg = ParserGenerator(
# A list of all token names, accepted by the parser. 
     ['String']
)
@pg.production('program: String')
def program(p):
    return p[0].value

parser = pg.build() #should parse string 'ABC'

ParserGeneratorError: Ожидается:

Смущен, это даже не в документации, пожалуйста, ответьте Хотите, чтобы мой вывод читал как 'AB C'

1 Ответ

0 голосов
/ 06 февраля 2020

Ваш код указывает, что вы тестировали лексер. Однако тест показывает, что лексер не выдает правильные токены:

>>> for token in l.lex('ABC'):
...   print(token)
... 
Token('String', 'A')
Token('String', 'B')
Token('String', 'C')

Ожидаемый результат будет

Token('String', 'ABC')

Причина, по которой вы разбиваетесь на отдельные символы, заключается в том, что ваш шаблон распознавания String соответствует только одному символу:

lg.add('String', r'\D')

Возможно, вы хотели что-то более похожее на

lg.add('String', r'\D+')

Но учтите, что \D соответствует всему, что не является десятичным di git, включая пробелы, знаки препинания и управляющие символы. Возможно, это то, что вы хотели, но мне это кажется слишком уместным.


Не имеет значения, но вам придется это исправить: насколько я знаю, RPLY (как Ply) требует от вас написания правил грамматики с пробелами вокруг двоеточия, поэтому ваша функция синтаксического анализа должна быть

@pg.production('program : String')
def program(p):
    return p[0].value
...