我正在尝试为一种使用 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 种数据类型的情况下消除这种减少/减少冲突。