Можно ли использовать другой лексер?
Я хотел бы использовать другой лексер для tatsu, но использовать парсер tatsu. Это возможно? Например, в грамматике:
expr = NUM | ID | (expr '+' expr) ;
Можно ли использовать альтернативный лексер для обеспечения NUM
а также ID
?
2 ответа
В целом, PEG-парсеры не используют отдельный лексер, потому что он им не нужен. Лексические элементы могут быть определены с использованием одного и того же языка грамматики.
TatSu, генератор парсера PEG, также не поддерживает отдельные лексеры, но Buffer
Класс предоставляет средства для избежания частичного совпадения литеральных токенов и для определения лексических элементов с помощью регулярных выражений:
expr = num | id | (expr '+' expr) ;
num = /\d+/ ;
id = /[a-zA-Z_]\w*/ ;
Последние версии TatSu позволяют использовать другой лексер (называемый
Tokenizer
в Тацу).
Синтаксическому анализатору, вероятно, придется полагаться на семантические действия, соответствующие правилам грамматики, которые соответствуют токенам.
Из моей работы по работе с парсером Python PEG есть несколько незавершенных экспериментов по адресу https://github.com/neogeny/pygl .