2016-07-08 1 views
0

я следующие грамматики:Использование Mid Правило Действия - зубр анализатор

expr : FUNC '(' expr ')' { ... } 
    | FUNC '(' expr ',' expr ')' { ... } 
    | expr '+' expr { ... } 
    | expr '-' expr { ... } 
    | NUM { ... } 

И я хотел бы, чтобы выполнять различные середине правило-действие на правило FUNC перед входом в выраж, в зависимости от правила.

Значение:

expr : FUNC { DO_ACTION_1 } '(' expr ')' { ... } 

или

expr : FUNC '(' { DO_ACTION_1 } expr ')' { ... } 

и в другом случае:

expr : FUNC { DO_ACTION_2 } '(' expr ',' expr ')' { ... } 

или

expr : FUNC '(' { DO_ACTION_2 } expr ',' expr ')' { ... } 

, но я продолжаю получать ошибку уменьшения/уменьшения и $$ 1 (или $$ 2 в зависимости от использования выше) никогда не будет уменьшаться.

ответ

0

Эта проблема описана в bison documentation, а также механизмы для устранения двусмысленности.

Неоднозначность из-за бизона, нуждающегося в фиксации того, какой из двух правил применяется на ранней стадии синтаксического анализа, и на этапе вашего действия он не может сказать.

Когда он соответствует:

FUNC 

или

FUNC '(' 

или даже

FUNC '(' expr 

Он по-прежнему может быть один из трех синтаксических правил и, таким образом, действие неоднозначно.

Для устранения неоднозначности можно прикрепить действие на терминальный символ (либо FUNC или '(') или создать правило для преамбулы, которая содержит действия:

func : FUNC { DO_ACTION1 } ; 
bra : '(' { DO_ACTION1} ; 

или

func_open : FUNC '(' expr { DO_ACTION1 }; 
expre : func_open | func_open ',' expr | etc 
+0

Tompsett - это не решает мою проблему. Я мог бы использовать аналогичные, как вы предложили FUNC MIDAC '(' expr ')' и FUNC MIDAC '(' expr ',' expr ')', но это будет означать одно и то же действие для обоих правил. Никаких конфликтов с использованием правила MIDAC. В моем вопросе я уточнил, что мне нужны разные действия. Если правило с func 1 arg сопоставлено, мне нужно выполнить действие A перед входом expr. Если func 2 args соответствует, мне нужно выполнить действие B перед входом expr. Это проблема. –

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