Я пишу лексер для 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 само по себе или (надеюсь) в моих методах?
Заранее спасибо!