Правила приоритета в зубров

Вот правила грамматики:

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;

Спасибо, Гокул.

Другие вопросы по тегам