我正在使用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在将空对象转换为符号时遇到问题。即使在从CUP官方网站运行this example时,我也会收到此错误。
发布于 2018-10-28 11:57:43
发布于 2019-10-04 05:17:31
我不知道有什么bug,但我知道你可以重写你的语法来使空格工作。例如:
Prog ::=
class_block:cb statement:s
| /* the empty production */
;我已经尝试过了,它适用于空的产品。有一个结果,它是一个块,然后是一个语句,或者是一个语句,或者是一个空的冲突。在程序语法规则的解析器生成过程中,没有办法区分哪个是语句,什么是空语句。仅将其更改为块和语句,或者将其更改为空可以澄清这一点。
https://stackoverflow.com/questions/52862424
复制相似问题