2015-05-30 3 views
1

Я хочу совместить константу, которая в основном представляет собой всю прописную строку.Константа и идентификатор синтаксического анализа

Кроме того, я хочу сопоставить идентификатор, который может содержать сочетание строчных и прописных букв.

Start 
    = Constant 
/Identifier 

Identifier 
    = h:[A-Za-z_] t:[a-zA-Z0-9_]* { return { type: 'IDENTIFIER', value: h + t.join('') } } 

Constant 
    = h:[A-Z] t:[A-Z_0-9]* { return { type: 'CONSTANT', value: h + t.join('') } } 

Проблема, когда я пытаюсь соответствовать Asd, он говорит: Line 1, column 2: Expected [A-Z_0-9] or end of input but "s" found.

Кажется, что он соответствует Constant правило, но не перекачиваться на идентификатор одной, даже если он не ...

проблема, кажется, что константа также является допустимым идентификатором, но я не могу понять правила сломать неоднозначность, я думаю, что если Constant матч не удается, то нужно просто попробовать правило Identifier ...

ответ

1

Проблема здесь возникает b ecause синтаксический анализ выражений грамматики не похожи на контекстно-свободные грамматики. Они получают первый матч вместо возврата. Правило Constant определено до Identifier. Asd соответствует стартовому символу для правила константы, но следующий символ не вызывает поэтому ошибку, потому что он детерминирован. Будем надеяться, что это легко исправить:

Start 
    = Constant 
/Identifier 

Identifier 
    = h:[A-Za-z_] t:[a-zA-Z0-9_]* { return { type: 'IDENTIFIER', value: h + t.join('') } } 

Constant 
    = h:[A-Z] ![a-z] t:[A-Z_0-9]* { return { type: 'CONSTANT', value: h + t.join('') } } 

Выходы:

{ 
    "type": "IDENTIFIER", 
    "value": "Asd" 
} 

PEGs, по умолчанию, детерминированный и избежать двусмысленности, как ваше правило определяет.

 Смежные вопросы

  • Нет связанных вопросов^_^