将非终结符强制转换为java_cup.runtime.Symbol以获取语法中的空字符

时间:2018-10-25 22:35:30

标签: java runtime symbols cup

我正在使用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强制转换为对象而不是符号。

所以。我在这里做错了什么?为什么空案例会产生如此奇怪的解析器?那么解决方案是什么?

1 个答案:

答案 0 :(得分:0)

此问题已解决,方法是将Mac OS从10.13升级到10.14,然后在/ usr / bin中安装CUP。不幸的是,我不确定为什么这样。