8

変数を宣言するのはどちらにしますか?その場合、グローバルスコープまたは@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';
4

1 に答える 1

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

ローカルルールスコープの使用を検討するのは、述語が多数ある場合、またはグローバルバックトラッキングが有効になっている場合のみです(すべてのルールの前に述語があります)。その場合、メンバー変数String x作成して(またはグローバルスコープで定義して)ルールに設定できますが、このインスタンス/スコープ変数を変更すると、パーサーがバックトラックできるようになりますparse。このバックトラックによって、元の形式/状態に設定されるグローバル変数!ローカルスコープの変数も「未設定」ではありませんが、リスクは低くなる可能性があります。つまり、単一のルールに対してローカルであるということです。

要約すると、そうです、グローバルスコープとメンバー/インスタンス変数は非常に似ています。しかし、構文がわかりやすいため、すぐにmembers-variablesを選択します。

于 2012-05-16T10:21:46.430 に答える