2013-05-06 82 views
2

我的编译器课程分配中的语言不允许在没有括号的表达式中使用混合运算符,可能不会使我们处理执行优先级。这意味着以下是有效的表达式:解析表达式时没有混合运算符时减少/减少冲突

# Valid 
1 + 2 + 3 
1 + (2 * 3) 
1 

但是,这并不:

# Invalid 
1 + 2 * 3 

也不是空的表达。从我的实际语法摘录,表达式如下解析:

%token TNumber 
%start expr 

%% 

expr : mulexpr 
    | addexpr 
    ; 

mulexpr : mulexpr '*' term 
     | term 
     ; 

addexpr : addexpr '+' term 
     | term 
     ; 

term : '(' expr ')' 
    | TNumber 
    ; 

但是,这种情况会发生减少/减少冲突。我是猜测这是因为像123这样的单项表达式可以减少为TNumber -> term -> mulexpr -> exprTNumber -> term -> addexpr -> expr,但我并不确定。我宁愿让语法毫不含糊,而不是希望模糊性是我认为的那样。但是,我不能想出解决这种歧义的方法。

我的想法是,我要补充一个规则expr : term;,然后以某种方式使addexprmulexpr需要2个或更多项目,但我无法弄清楚如何表达这一点。

更新:虽然我找到了一个工作解决方案,如果有一个重复“代码”少,它会得到接受。

回答

2

制作为mulexpraddexpr递归停止条件是两任表达作品:。

expr : mulexpr 
    | addexpr 
    | term 
    ; 

mulexpr : mulexpr '*' term 
     | term '*' term 
     ; 

addexpr : addexpr '+' term 
     | term '+' term 
     ; 

(想通了这一点5秒发布问题后,SO为一个伟大的橡皮鸭 我猜测我的大脑只是强迫性地试图避免这种重复。)