Можно ли использовать другой лексер?

Я хотел бы использовать другой лексер для 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 .

Другие вопросы по тегам