Хотите ли вы, чтобы токен представлял собой пустую последовательность символов или нетерминал, который соответствует пустой последовательности токенов?
Как объясняется в FAQ по JavaCC , нетерминалэто соответствует пустой последовательности токенов
void Empty() : {}
{
{}
}
Синтаксис файлов грамматики JavaCC не позволяет expansion_choices
быть пустым.Но вы можете поместить пустой блок Java, как указано выше.
Однако, если у вас есть этот нетерминал, то Empty()
будет таким же, как {}
.Например, я мог бы написать
void SomeNonterminal() : {}
{
A() B() C()
|
Empty()
}
или я мог бы написать
void SomeNonterminal() : {}
{
A() B() C()
|
{}
}
Это логически одно и то же.
Токен, соответствующий пустой последовательности
TOKEN: { <EMPTY : ""> }
легко определить из символов. Однако, это, вероятно, плохая идея.Если бы этот токен совпадал, то он снова совпадал бы на следующей итерации лексера, и у вас была бы бесконечная последовательность этих токенов!
Единственный раз, когда это имеет смысл, это взять лексериз одного лексического состояния в другое.Например,
<SOMESTATE> TOKEN: { <EMPTY : ""> : DEFAULT }