Как сопоставить пустой регистр в грамматике парсера CUP - PullRequest
0 голосов
/ 17 октября 2018

Я использую CUP для генерации парсера и хочу, чтобы пустой файл был приемлемой программой.Я попытался добавить пустой символ к своему начальному символу, основываясь на ответе на аналогичный вопрос здесь .

start with prog;

/* The grammar rules */
prog    ::= class_block:cb   
        |   class_block:cb stmts:sb
        |   stmts:sb
        |   // desired empty case
        ;

Включение желаемого пустого регистра дает мне следующую ошибку:

parser.java:516: error: incompatible types: Object cannot be converted to Symbol
CUP$parser$result = parser.getSymbolFactory().newSymbol("prog",0, ((java_cup.runtime.Symbol)CUP$parser$stack.peek()), RESULT);

Как я могу изменить мою грамматику, чтобы синтаксический анализатор принимал пустой файл?Я использую Jflex в качестве лексера и ComplexSymbolFactory в качестве типа символов.

РЕДАКТИРОВАТЬ: я подтвердил, что приведенная выше грамматика является правильным способом включения пустых.Однако у ComplexSymbolFactory возникают проблемы с преобразованием пустого объекта в символ.Я получаю эту ошибку даже при запуске этого примера с официального сайта CUP.

1 Ответ

0 голосов
/ 28 октября 2018

Я скачал .jars из проекта друга github, и проблема решена.

Вы можете увидеть, что это ошибка здесь: https://github.com/jflex-de/jflex/issues/384

Попробуйте понизить версию.

...