如何匹配 CUP 解析器语法中的空大小写



我正在使用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 官方网站运行此示例,我也会收到此错误。

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

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

尝试降级版本。

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

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

我已经尝试过这个,它适用于空的作品。有一个生产,它是一个块,然后是一个语句,或者一个语句,或者一个空的,冲突。在程序语法规则中,解析器的生成过程中没有办法判断哪个是语句,什么是空的。仅将其更改为块和语句,或为空即可澄清这一点。

相关内容

  • 没有找到相关文章

最新更新