Как мне написать грамматику для этого (негативные взгляды в Peg.js)? - PullRequest
0 голосов
/ 17 октября 2018

РЕДАКТИРОВАТЬ: больше информации на Поддерживает ли движок 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

Как мне это сделать?

1 Ответ

0 голосов
/ 19 октября 2018

Возможно, я неправильно понимаю, чего вы пытаетесь достичь, но разве не нравится эта работа?

expression
    = terms ( _ delimiter _ terms )*

terms "terms"
    = term ( _ term )*

term "term"
    = [a-z]+

delimiter "delimiter"
    = "."

_ "whitespace"
  = [ \t\n\r]+
...