javacc Расширение в пределах "(...) +" может совпадать с ошибкой пустой строки - PullRequest
0 голосов
/ 13 марта 2020

Я работаю над парсером и требую, чтобы для каждого ключевого слова выдавались пользовательские ошибки. Мой код следующий:

SKIP:  { " " | "\t" | "\n" | "\r" }
TOKEN: { "DEF" | "MAIN" | <NAME: (["A"-"Z"])+> | <PARAM: (["a"-"z"])+> | <NUM: (["0"-"9"])+> }

void Start(): {} {(Def() Func())+ <EOF>}

void Def(): {} {"DEF" | { throw new ParseException("expected keyword DEF"); }}

void Func(): {} {"MAIN" | Name() Param() | { throw new ParseException("Expected MAIN or NAME PARAM"); }}

void Name(): {} {<NAME> | { throw new ParseException("invalid function name"); }}

void Param(): {} { <PARAM> | { throw new ParseException("invalid PARAM"); }}

Функция Start() выдаёт мне ошибку и сообщает, что Expansion within "(...)+" can be matched by empty string error. Я думаю, что проблема в Name() Param() части Func(), но я не знаю, как это изменить, все еще выбрасывая пользовательские сообщения об ошибках. Кто-нибудь может дать несколько указателей?

1 Ответ

0 голосов
/ 24 марта 2020

Хотя я согласен с комментарием от пользователя 207421, вы можете сделать следующее

void oneOrMoreThings() : {} {
    (Thing() | (throw new ParseException( ... ) ; }
    ( Thing() )*
}
...