как использовать пустое слово в JAVACC в качестве токена? - PullRequest
0 голосов
/ 01 февраля 2019

Я настраиваю синтаксический анализатор с использованием JavaCC и хочу использовать пустое слово в качестве токена (слово epsilon)

Я пытался использовать нетерминальное

    void Empty() : 
     {}
     {
     } 

, ноя получаю сообщение об ошибке

я пробовал токен ничего не получалось

Я хочу, чтобы токен представлял пустое слово

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Хотите ли вы, чтобы токен представлял собой пустую последовательность символов или нетерминал, который соответствует пустой последовательности токенов?


Как объясняется в 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 }
0 голосов
/ 01 февраля 2019

прочитав много вопросов и статей, я нашел, что использовал {}, и все заработало

...