我正在使用 JFlex 和 CUP 编写编译器。我正在尝试解析 .cup 文件中的空状态。为了简化事情,请考虑以下语法:
terminal Integer INT_LIT;
nonterminal List<Statement> stmtlist;
nonterminal Statement stmt;
start with stmtlist;
stmtlist ::= stmtlist:sl stmt:s {: sl.add(s); RESULT = sl; :}
| {: RESULT = new LinkedList<Statement>(); :}
;
stmt ::= INT_LIT:i {: RESULT = Statement.stub(); :}
在这里,Statement.stub() 返回一个存根的 Statement 实例用于测试目的。
我收到此错误:
parser.java:653: error: incompatible types: List<Statement> cannot be converted to Symbol
CUP$parser$result = parser.getSymbolFactory().newSymbol("stmtlist",2, ((java_cup.runtime.Symbol)CUP$parser$stack.peek()), RESULT);
我对此感到困惑,因为对 newSymbol 的调用提供了参数:
parser.getSymbolFactory().newSymbol(String name, int id, Symbol left, Symbol right)
这与我的解析器中对 newSymbol() 的所有其他调用不同。对 newSymbol() 的所有其他调用都采用以下形式:
parser.getSymbolFactory().newSymbol(String name, int id, Symbol left, Symbol right, Object value)
有效地将 RESULT 转换为 Object 而不是 Symbol。
所以。我在这里做错了什么?为什么空的情况下会产生如此奇怪的解析器?解决方案是什么?