转换/减少杯子解析器中的冲突(带有数组和矩阵的语法)

时间:2013-05-10 07:41:26

标签: parsing shift-reduce-conflict cup

我正在为一种小语言编写一个杯子解析器,它应该支持以数组和矩阵作为字段的类。例如,如果有一个类实例:

C c;

使用以下方式访问字段:

c.x;
c.y[];
c.z[][];

我在为最后一部分编写作品时遇到了麻烦,因为我一直在改变/减少冲突。这是我的作品:

Designator ::= IDENT
               |
               Designator DOT IDENT
               |
               Designator LSQUARE Expr RSQUARE
               |
               Designator LSQUARE Expr RSQUARE LSQUARE Expr RSQUARE
               ;

警告: * 转移/减少状态#189中发现的冲突   在Designator :: = Designator LSQUARE Expr RSQUARE()之间   和指示符:: =指定符LSQUARE Expr RSQUARE()LSQUARE Expr RSQUARE   在符号LSQUARE下   决心转移。

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

你的语法的最后一行Designator无效。 Designator LSQUARE Expr RSQUARE(上面两行)已经递归地定义了任意多维的锯齿状数组表达式。

根据你的语法,以下表达式将是有效的:

c.y[a].b

以下内容无效:

c.y[a].z[b]

这是出于意图吗?

查看知道锯齿状数组的C# grammar可能会很有启发性。