ocamlyacc的冲突

时间:2013-02-23 15:54:35

标签: debugging types ocamlyacc reduce-reduce-conflict

我正在尝试为一种使用ocamlyacc识别整数和浮点表达式的简单语言编写解析器。但是我想介绍一下变量的可能性。所以我在 lexer.mll 文件中定义了令牌 VAR ,它允许它是以大写字母开头的任何字母串。

 expr:
 | INT                      { $1 }
 | VAR                      { /*Some action */}
 | expr PLUS expr           { $1 + $3 }
 | expr MINUS expr          { $1 - $3 }

 /* and similar rules below for real expressions differently */

现在我对实数有类似的定义。但是,当我运行此文件时,我得到2减少/减少冲突,因为如果我只输入一个随机字符串(标识为令牌VAR)。在我的语法中定义int和real表达式时,解析器不知道它是真实的还是整数类型的变量,因为关键字VAR存在。

Var + 12  /*means that Var has to be an integer variable*/
Var  /*Is a valid expression according to my grammar but can be of any type*/

如何在不失去变量声明的一般性和维护我可用的2种数据类型的情况下消除此减少/减少冲突。

1 个答案:

答案 0 :(得分:0)

exp:
    | sub {$1}
    | exp PLUS sub {$1+$3}

sub:
    | basic_unit {$1}
    | sub MINUS basic_unit {$1-$3}

basic_unit:
    | INT {$1}
    | VAR { /*some action*/ }