Существует ли логическое AND и NOT в ANTLR? - PullRequest
6 голосов
/ 04 апреля 2011

Нет ли логики в ANTLR? Я в основном пытаюсь отрицать правило, которое у меня есть, и мне было интересно, если это возможно, также есть ли логика?

Ответы [ 2 ]

11 голосов
/ 04 апреля 2011

@ larsmans уже предоставили ответ, я просто хотел бы привести пример юридических отрицаний в правилах ANTLR (так как с ними часто случается ошибка).

Оператор отрицания в ANTLR равен ~ (тильда). Внутри правил лексера, ~ отрицает один символ:

NOT_A : ~'A';

соответствует любому символу, кроме 'A' и:

NOT_LOWER_CASE : ~('a'..'z');

соответствует любому символу, кроме строчной буквы ASCII. Пример лат также может быть записан как:

NOT_LOWER_CASE : ~LOWER_CASE;
LOWER_CASE : 'a'..'z';

Пока вы отрицаете только один символ, допустимо использовать ~. неверно делать что-то вроде этого:

INVALID : ~('a' | 'aa');

потому что вы не можете отрицать строку 'aa'.

Внутри правил парсера отрицание не работает с символами, но с токенами. Итак, правило parse:

parse
  :  ~B
  ;

A : 'a';
B : 'b';
C : 'c';

не не соответствует любому символу, кроме 'b', но соответствует любому токену, кроме B. Таким образом, он будет соответствовать токену A (символ 'a') или токену C (символ 'c').

Та же логика применяется к оператору . (DOT):

  • внутри правил лексера соответствует любому символу из набора \u0000..\uFFFF;
  • внутри правил парсера он соответствует любому токену (любому правилу лексера).
6 голосов
/ 04 апреля 2011

ANTLR создает парсеры для контекстно-свободных языков (CFL).В этом контексте not будет означать дополнение и and пересечение.Однако КЛЛ ​​не закрываются под дополнением и пересечением, т. Е. not(rule) не обязательно является правилом КУГ.таким образом, они не поддерживаются.

...