我一直保持移位/减少错误程。现在,终于我想我遇到了我的比赛。

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是不是含糊的语法非常好,它需要早作决定哪条路径遵循。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top