Как указать точное количество вхождения токена в ANTLR?
-
08-07-2019 - |
Вопрос
Я должен определить грамматику файла, как показано ниже.
// Пример файла
NameCount = 4
Имя =
Имя = B
Имя = С
Имя = D
// Конец файла
Теперь я могу определять токены для NameCount и Name . Но мне нужно определить структуру файла, включая действительное число экземпляров токена Name , который является значением после NameCount . У меня есть значение, проанализированное и преобразованное в целое число и сохраненное в переменной в глобальной области грамматики (скажем, в переменной nc ). Р>
Как определить в грамматике, что имя должно повторяться ровно нц раз?
Решение
Это не может быть выражено в самой грамматике. Если число было фиксированным, вы можете указать количество ожидаемых токенов. Но поток токенов изменяется в зависимости от значения. Что вы можете сделать, это включить это в комбинацию лексер / парсер. Но вы не можете создать эту конструкцию только с помощью простого грамматического синтаксиса. Вы, вероятно, хотите что-то вроде
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++;
}
...
Другие советы
Я не уверен, что это грамматика без контекста. Если это не так, вы не можете сказать ANTLR, чтобы он анализировал язык.