Ваш код указывает, что вы тестировали лексер. Однако тест показывает, что лексер не выдает правильные токены:
>>> 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