Я пишу компилятор, используя 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 к объекту вместо символа.
Итак.Что я здесь не так делаю?Почему пустой случай генерирует такой странный парсер?И каково решение?