Как указать точное количество вхождения токена в ANTLR? - PullRequest
2 голосов
/ 21 ноября 2008

Я должен определить грамматику файла, как показано ниже.

// Пример файла
NameCount = 4
Имя =
Имя = b
Имя = с
Имя = Д
// Конец файла

Теперь я могу определить токены для NameCount и Name . Но мне нужно определить структуру файла, включая действительное число экземпляров токена Name , который является значением после NameCount . У меня есть значение, проанализированное и преобразованное в целое число и сохраненное в переменной в глобальной области видимости грамматики (скажем, в переменной nc ).

Как определить в грамматике, что Имя должно повторяться ровно NC раз?

Ответы [ 2 ]

6 голосов
/ 03 декабря 2008

Это не может быть выражено в самой грамматике. Если число было фиксированным, вы можете указать количество ожидаемых токенов. Но поток токенов изменяется в зависимости от значения. Что вы можете сделать, это включить это в комбинацию лексер / парсер. Но вы не можете создать эту конструкцию только с помощью простого грамматического синтаксиса. Вы, вероятно, хотите что-то вроде

grammar test;

@members {
  private int count = 0;
  private int names = 0;
}

file
    : count (name)+
      {
        if (count != names) throw new Exception("");
      }
    ;

count
    : 'NameCount' EQ Number
      {
        count = Integer.parseInt($Number.text);
      }
    ;

name
    : 'Name' EQ Value
      {
        names++;
      }
...
1 голос
/ 21 ноября 2008

Я не уверен, что это грамматика без контекста. Если это не так, вы не можете указать ANTLR на синтаксический анализ языка.

...