Правила приоритета в зубров
Вот правила грамматики:
ProcessExpression : EventExpression "->" ProcessExpression
| ProcessName ;
Скажите, пожалуйста, как я могу сказать зубру, что первое правило имеет более высокий приоритет, чем второе?
Я пытался:
%nonassoc PROC
%right "->"
ProcessExpression : EventExpression "->" ProcessExpression
| ProcessName % prec PROC;
Но без какого-либо результата. Спасибо.
2 ответа
Для разрешения конфликтов "уменьшить / уменьшить" bison отдает приоритет правилам в том порядке, в котором они находятся в исходном файле, поэтому, будучи первым, первое правило имеет более высокий приоритет. Но это явно не то, что вы хотите, иначе вы бы не задавали этот вопрос.
Использование%nonassoc/%right дает приоритеты токенам для разрешения конфликтов сдвига / уменьшения. В этом случае важен приоритет перехода токена к приоритету правила, которое должно быть уменьшено. Здесь задействовано только одно правило (хотя в текущем состоянии могут быть частично проанализированы другие правила), поэтому нет смысла говорить о том, что одно правило имеет более высокий или более низкий приоритет, чем другое в этой ситуации.
Так что же ты пытаешься сделать? Что именно идет не так? Схожи ли EventExpression и ProcessName, чтобы у них были конфликты? Вы не даете никакой информации о том, что это за правила...
Я думаю, что вы можете применить то, что написали, только когда есть левая рекурсия. Так что попробуйте что-то вроде этого.
%nonassoc PROC
%left EVENT
ProcessExpression : EventExpression "->" ProcessExpression %prec EVENT
| ProcessName % prec PROC;
Спасибо, Гокул.