Я пытаюсь определить язык, используя Jison с очень маленькой пунктуацией для делимитации - например, CoffeeScript, но без отступа. Это то, чего я хочу достичь:Является ли эта грамматика двусмысленной?
# Definition
object1, object2
property1 = value1,
property2 = value2
# Definition
object3 property = value
# Statement
object1 + object2 + object3
Это определяет три объекта с некоторыми свойствами и добавляет их. Обратите внимание, что первое определение указывает два объекта, используя список имен, а второй показывает, что пробелы не должны быть значительными.
Я чувствую, что грамматика не является двусмысленной, несмотря на отсутствие символов начала и конца между списком имен и списком свойств. Грамматика указывает, что за каждым списком имен следует список свойств. Все это, кажется, работает нормально, если я пишу грамматику только с указанием определений, в том числе производств, таких как:
definition
: name_list property_list
;
name_list
: name
| name_list ',' name
;
property_list
: property
| property_list ',' property
;
property
: name '=' name
;
Теперь я добавить правила для выражения части грамматики, в довольно обычным способом, насколько я могу сказать:
expr
: expr '+' expr
| expr '/' expr
| name
;
Jison жалуется, что «различные возможные действия» для связки различных упреждающих маркеров в некотором пронумерованном состоянии. Варианты сокращения обычно выглядят как:
- reduce by rule: name_list -> name
- reduce by rule: expr -> name
Я считаю, что грамматика быть однозначным, но как я могу убедить Jison это? Кажется, что, возможно, нужно смотреть вперед на два токена вместо одного, но это глупое предположение, и документация Jison отмечает, что он (пока?) Не поддерживает LL (k) грамматики.
Да это неоднозначная грамматика. Получите помощь от этого [вопрос и ответ] (http://stackoverflow.com/questions/14554752/how-can-i-add-parentheses-as-the-highest-level-of-precedence-in-simple -grammar/14569166 # 14569166) –
Трудно сказать, не видя ваших правил для 'property_list'. –
@DavidGorsline Я добавил свойства 'property_list' и' property'. Просто не хотелось слишком долго задавать вопрос. –