将一个非终端强制转换为java_cup.runtime.Symbol,表示语法中的空大小写



我正在使用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((返回一个存根语句实例用于测试。

我得到这个错误:

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。

所以。我在这里做错了什么?为什么这个空案例会生成这样一个奇怪的解析器?解决方案是什么?

通过将我的Mac操作系统从10.13升级到10.14,并在/usr/bin中安装CUP,解决了这个问题。不幸的是,我不知道为什么会这样。

相关内容

  • 没有找到相关文章

最新更新