Приведите нетерминал к java_cup.runtime.Symbol для пустого регистра в грамматике - PullRequest
0 голосов
/ 26 октября 2018

Я пишу компилятор, используя 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 голосов
/ 30 октября 2018

Эта проблема была решена путем обновления моей Mac OS с 10.13 до 10.14 и установки CUP в / usr / bin.К сожалению, я не уверен, почему это сработало.

...