1

我正在使用 CUP 生成解析器,并且我希望空文件成为可接受的程序。根据对此处类似问题的回答,我已尝试将空案例添加到我的开始符号中。

start with prog;

/* The grammar rules */
prog    ::= class_block:cb   
        |   class_block:cb stmts:sb
        |   stmts:sb
        |   // desired empty case
        ;

包括所需的空箱会给我以下错误:

parser.java:516: error: incompatible types: Object cannot be converted to Symbol
CUP$parser$result = parser.getSymbolFactory().newSymbol("prog",0, ((java_cup.runtime.Symbol)CUP$parser$stack.peek()), RESULT);

如何修改语法以使解析器接受空文件?我使用 Jflex 作为我的词法分析器,并使用 ComplexSymbolFactory 作为符号的类型。

编辑:我已经确认上面的语法是包含空的正确方法。但是,ComplexSymbolFactory 在将空对象转换为符号时遇到问题。即使从官方 CUP 网站运行此示例,我也会收到此错误。

4

2 回答 2

1

我从一个朋友的 github 项目下载了 .jars 并解决了问题。

您可以在这里看到这是一个 BUG:https ://github.com/jflex-de/jflex/issues/384

尝试降级版本。

于 2018-10-28T03:57:42.863 回答
0

我不知道任何错误,但我知道您可以重写语法以使空案例工作。例如:

Prog ::= 
   class_block:cb statement:s
   | /* the empty production */
;

我已经尝试过了,它适用于空制作。有一个产生式,它是一个块,然后是一个语句,或者一个语句,或者一个空的,冲突。在程序语法规则的解析器生成过程中,没有办法分辨哪个是语句,什么是空的。仅将其更改为块和语句或空就可以说明这一点。

于 2019-10-03T21:17:30.580 回答