Я работаю над парсером и требую, чтобы для каждого ключевого слова выдавались пользовательские ошибки. Мой код следующий:
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()
, но я не знаю, как это изменить, все еще выбрасывая пользовательские сообщения об ошибках. Кто-нибудь может дать несколько указателей?