如何在CUP解析器语法中匹配空白字符

时间:2018-10-17 19:38:49

标签: java compiler-construction parser-generator jflex cup

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

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在将空对象转换为符号时遇到问题。 即使从官方银联网站运行this example,我也会收到此错误。

2 个答案:

答案 0 :(得分:1)

我从一个朋友github项目下载了.jars,问题得以解决。

您可以在此处看到它的错误:https://github.com/jflex-de/jflex/issues/384

尝试降级版本。

答案 1 :(得分:0)

我不知道任何错误,但是我知道您可以重写语法以使空的情况有效。 例如:

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

我已经尝试过了,它适用于空作品。在有一个生产的地方,它是一个块,然后有一个语句,一个语句或一个空的冲突。在生成语法分析器的过程中,没有办法告诉程序语法规则,该规则是一条语句,什么是空的。只需将其更改为一个块和一条语句,或者将其更改为空白即可。