Вопрос по – Antlr декларация глобальной области действия vs декларация @members

8

Какой из них вы бы предпочли объявить переменной, в каком случае, глобальную область или объявление @members? Мне кажется, что они могут служить для той же цели?

UPDATE Вот грамматика, чтобы объяснить, что я имею в виду.

grammar GlobalVsScope;

scope global{
  int i;
}
@lexer::header{package org.inanme.antlr;}
@parser::header{package org.inanme.antlr;}

@parser::members {
  int j;
}

start
scope global;
@init{
  System.out.println($global::i);
  System.out.println(j);
}:R EOF;

R:'which one';
Ах, не целевой языкscope, но АНТЛР-scopes, Я понимаю. Bart Kiers
пожалуйста, посмотрите на пример грамматики. mert inan

Ваш Ответ

1   ответ
9

Обратите внимание, что помимо глобальных (ANTLR) областей вы также можете иметьlocal области действия правил, как это:

grammar T;

options { backtrack=true; }

parse
scope { String x; }
parse
 : 'foo'? ID {$parse::x = "xyz";} rule*
 | 'foo' ID
 ;

rule
 : ID {System.out.println("x=" + $parse::x);}
 ;  

Единственный раз, когда я рассмотрю вопрос об использованииlocal Область действия правил - это когда много предикатов, или включена глобальная обратная обработка (что приводит кall правила иметь предикаты перед ними). В этом случае выcould создать переменную-членString x (или определить его в глобальной области видимости) и установить вparse правило, но вы можете изменить эту переменную экземпляра / области видимости, после чего анализатор может вернуться назад, и этот возврат будетnot заставить глобальную переменную быть установленной в ее первоначальную форму / состояние! Локальная переменная такжеnot быть "unset", но это, вероятно, будет меньше риска: они являются локальными для одного правила.

Подводя итог: да, вы правы, глобальные области видимости и переменные члена / экземпляра очень похожи. Но я бы предпочел переменные-члены из-за более дружественного синтаксиса.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded mert inan

Похожие вопросы