Исключение определенных элементов из указанного набора в Parsing Expressive Grammar (PEG.js)? - PullRequest
1 голос
/ 08 февраля 2011

Я пишу лексер для Haskell, используя JavaScript и грамматику выражения синтаксического анализа. Я использую реализацию PEG.js .
У меня проблема с тем, чтобы заставить его работать для зарезервированных слов, как показано вздесь упрощенная форма:

program = ( word / " " )+  
word = ( reserved / id )  
id = ( "a" / "b" )+  
reserved = ( "aa" )

Суть в том, чтобы получить серию токенов, которые являются либо произвольными последовательностями a: s и / или b: s, либо последовательностью «aa», и они разделеныпо пробелам.
То, что я действительно получаю, это то, что каждый токен, который не является пробелом, распознается как id, или что токен, который должен быть распознан как id, имеет все начальные пары: s съедается как reserved, например,
"aab" распознается как reserved "aa", за которым следует id "b".

Способ, которым лексическая спецификация Haskell решает эту неоднозначность, состоит в том, чтобы указывать id следующим образом:

id = ( "a" / "b" )+[BUT NOT reserved]

Я пытался повторить это, используя различные комбинации PEG!и операторы для достижения того же эффекта, но не нашли способ заставить это работать должным образом.
Решение:

id = !reserved ( "a" / "b" )+

, которое я видел предложенным в нескольких местах, не работает.
Это ограничение в конкретной PEG-реализации, PEG само по себе или (надеюсь) в моих методах?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

!reserved ident является вполне приемлемым методом в любой реализации PEG, и PEG.js, похоже, также поддерживает его.Кстати, вы должны добавить !id после определения reserved.

0 голосов
/ 22 марта 2011

Насколько я знаю, правила PEG являются позиционными.Это в основном означает, что правила пробуются детерминистически от первого до последнего.Тем не менее, вам просто нужно поставить «зарезервированное» правило перед объявлением «идентификатора».

...