РЕДАКТИРОВАТЬ: больше информации на Поддерживает ли движок Peg.js после оглядки, как это делают регулярные выражения?
Итак, я изучал переводчиков в целом и, в частности,Я недавно работал с peg.js над созданием парсера из грамматики.
Вот пример проблемы, с которой я столкнулся.Где следующее содержит три «термина» («abc def», «ghi» и «jkl») и два «разделителя» ('.'), Как я могу написать грамматику:
abc def . ghi . jkl
Для меня это не было проблемой:
abc . def . ghi
Я использовал это:
expression
= term ( _ delimiter _ term )*
term "term"
= [a-z]+
delimiter "delimiter"
= "."
_ "whitespace"
= [ \t\n\r]+
Однако для меня это было большой проблемой:
abc def . ghi . jkl
Как только термины и разделители разделяют токен - пробел - я не могу продолжить.Это, например, не работает:
term "term"
= [a-z| ]+
Проблема была в том, что все, что я пытаюсь сделать, требует, чтобы лексер или указатель, я не уверен в правильной терминологии, переместился на точку до окончаниятермин, поэтому он терпит неудачу, думая, что он уже прошел пробел, который он искал в качестве разделителя.
Я, по сути, не могу заглянуть вперед и сказать, ах это пространство на самом деле первое значениеразделитель, а не последний из выражения.
Операторы типа Lookahead, такие как '&', управляют только при использовании совпадения или нет, но все же перемещают указатель в эту позицию.
InНа самом деле, я хотел бы использовать оба моих символа-разделителя в моих терминах следующим образом:
term1.subterm1a subterm1b . term2 subterm2a.subterm2b
// two terms separated by ' . ' delimiter
Как мне это сделать?