Antlr синтаксический предикат не соответствует - PullRequest
1 голос
/ 27 марта 2012

У меня есть следующая грамматика:

rule  : (PATH)=> (PATH) SLASH WORD
   {System.out.println("file: " + $WORD.text + " path: " + $PATH.text);};
WORD  : ('a'..'z')+;
SLASH   : '/';
PATH    : (WORD SLASH)* WORD;

, но она не работает для такой строки, как "a / b / c / filename".Я думал, что смогу решить эту проблему «пути» с помощью синтаксической предикатной функции.Может быть, я делаю что-то не так, и мне нужно пересмотреть грамматику.Любое предложение по этой проблеме?

1 Ответ

3 голосов
/ 27 марта 2012

Вы должны понимать, что синтаксический предикат будет не заставлять синтаксический анализатор давать лексеру какое-то направление относительно того, какой маркер парсер "хотел бы" получить.Синтаксический предикат используется, чтобы заставить анализатор смотреть в существующем потоке токенов для устранения неоднозначностей (акцент на «существующий»: анализатор не имеет никакого контроля над тем, какие токены создаются!).

Лексер работает независимо от анализатора, систематически создавая токены:

  1. он пытается сопоставить максимально возможное количество символов;
  2. всякий раз, когда совпадают 2 (или более) правилаПри таком же количестве символов правило, определенное первым, получит приоритет над правилом, определенным позже.

Таким образом, в вашем случае, учитывая ввод "a/b/c/filename", лексер будет жадно соответствовать всемуввод в виде одного PATH токена.

Если вы хотите получить имя файла, либо получите его из PATH:

rule  : PATH
        {
         String file = $PATH.text.substring($PATH.text.lastIndexOf('/') + 1);
         System.out.println("file: " + file + ", path: " + $PATH.text);
        }
      ;
WORD  : ('a'..'z')+;
SLASH : '/';
PATH  : (WORD SLASH)* WORD;

, либо создайте правило синтаксического анализатора, соответствующее пути:

rule  : dir WORD
        {
         System.out.println("file: " + $WORD.text + ", dir: " + $dir.text);
        }
      ;
dir   : (WORD SLASH)+;
WORD  : ('a'..'z')+;
SLASH : '/';
...