2012-05-16 4 views
8

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

ОБНОВЛЕНИЕ вот грамматика, чтобы объяснить, что я имею в виду.

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'; 
+0

, пожалуйста, посмотрите пример грамматики. –

+0

Ах, а не область * целевого языка *, но ANTLR- * scope *. Я понимаю. –

ответ

9

Обратите внимание, что помимо глобальных (Antlr) областей, вы также можете иметь местных ГОСПОДСТВА областей, например:

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);} 
; 

Единственный раз, когда я бы рассмотреть возможность использования местного rule- области, когда есть много предикатов, или глобальное отключение включено (в результате все правила имеют предикаты перед ними). В этом случае вы могли бы создать переменную-член String x (или определить ее в глобальной области) и установить ее в правиле parse, но вы можете изменить эту переменную instance/scope, после которой анализатор мог бы отступить, и этот откат будет , а не, чтобы глобальная переменная была установлена ​​в ее исходную форму/состояние! Локальная переменная с областью также будет не быть «неустановленной», но это, вероятно, будет менее опасным: они являются локальными для одного правила.

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

+0

все еще переваривается, спасибо большое! –

+0

@ mertinan, извините, мой более ранний ответ был не совсем прав (и немного расплывчатым, возможно). См. Мою отредактированную версию. –