题
我一直保持移位/减少错误程。现在,终于我想我遇到了我的比赛。
Int[] a
a[0] = 1
问题是INT []被定义为
Type OptSquareBrackets
而[0]被定义为
Var | Var '[' expr ']'
无功和类型都被定义为VAR这是任何有效的变量[a-zA-Z][a-zA-Z0-9_]
。除了添加伪令牌(如**Decl** Type OptSquareBrackets
代替)有没有写这个不有冲突的方法吗?从这一个规则我得到1个移/减少和1减少/降低的警告。
解决方案
可以定义一个新的令牌
VarLBracket [a-zA-Z][a-zA-Z0-9_]*\[
和因此定义声明
Type | VarLBracket ']';
和限定分配对象作为
Var | VarLBracket expr ']';
其他提示
创建与[]一个莱克斯规则自[]中声明只用于和其他地方将使用[VAR]
从技术上讲,该问题由试图语法绑到不实际的语法不同语意茎。
ISTM,你只需要描述两种类型和表现形式单一的语法结构。使区分代码,而不是在语法,尤其是如果没有实际句法差异。 YACC被称为编译程序的生成,但它是不是最位真。它只是使解析器。
说到这里,认识[]
作为终端符号可能是解决这个问题的,都得到一个更简单的方法。 YACC是不是含糊的语法非常好,它需要早作决定哪条路径遵循。
不隶属于 StackOverflow