ANTLR中国語マニュアルの3(ANTLRメタ言語-メタ言語用語集)

7684 ワード

メタ言語用語集
スペースはスペースを定義し、tab記号と改行記号はANTLRが識別子のような語彙記号を区切るときに区切り記号として使用されます.それ以外は無視されていますたとえば、「FirstName LastName」は、ANTLRに対して1つのマーカーではなく2つのマーカーであり、スペースであり、次に1つのマーカーである.
コメント
ANTLRはC言語スタイルのブロックコメントとC++スタイルの行コメントを受け入れます.文法クラスやルールでは、Javaスタイルのドキュメントコメントも受け入れられ、必要に応じて生成された出力ファイルに渡すことができます.たとえば
/**This grammar recognizes simple expressions
 * @author Terence Parr
 */
class ExprParser;
 
/**Match a factor */
factor : ... ;

文字セット
文字定数はJavaのように決定されます.これらには、8進数エスケープ文字セット(e.g.,'/377'),Unicode文字セット(e.g.,'/uFF 00')と、Javaによって識別される一般的な文字エスケープ('/b','/r','/t','/n','/f','/','/')が含まれる.構文解析規則では、単一引用符は入力文字ストリームで一致する文字を表します.シンタックスアナライザでは、単一引用符がサポートされていない文字です.
ファイル終了フラグEOFタグは構文解析規則で自動的に生成されます.
rule : (statement)+ EOF;

構文解析器の規則的な動作でEOF_を検出できますCHARシンボル:
// make sure nothing but newline or
// EOF is past the #endif
ENDIF
{
  boolean eol=false;
}
     :   "#endif"
         ( ('/n' | '/r') {eol=true;} )?
         {
           if (!eol) {
             if (LA(1)==EOF_CHAR) {error("EOF");}
             else {error("Invalid chars");}
           }
         }
     ;

ファイルを終了して文字が検出されると、実際には文字ではなく条件になります.
あなたの文法分析器の文法でCharScannerを上書きすることができます.uponEOF()関数:
/** This method is called by YourLexer.nextToken()
 *  when the lexer has
 * hit EOF condition. EOF is NOT a character.
 * This method is not called if EOF is reached
 * during syntactic predicate evaluation or during
 * evaluation of normal lexical rules, which
 * presumably would be an IOException. This
 * traps the "normal" EOF * condition.
 *
 * uponEOF() is called after the complete evaluation
 * of the previous token and only if your parser asks
 * for another token beyond that last non-EOF token.
 *
 * You might want to throw token or char stream
 * exceptions like: "Heh, premature eof" or a retry
 * stream exception ("I found the end of this file,
 * go back to referencing file").
 */
public void uponEOF()
  throws TokenStreamException, CharStreamException
{
}
 

ファイル終了条件は1ビットビット(2.7.1バージョンから)です.Terenceは-1を整数ではなく文字として扱うからです.(-1は'/uFFFF'...めまい!).
文字列
文字列定数は、二重引用符で囲まれた一連の文字です.文字列中の文字は、文字としても同様に合法的なエスケープ文字(8進法、Unicodeなど)であってもよい.現在、ANTLRでは、Unicodeが文字列定数に表示されることは実際には許可されていません(エスケープ文字を使用しなければなりません).これはanglr.gファイルにcharVocabularyオプションをasciiとする.
構文解析器の規則では、文字列は、入力ストリームに一致する一連の文字(例えば、「for」が「f′o′r′に等しい)として解釈される.
構文解析器ルールでは、文字列はタグを表し、独立した文字列ごとにタグタイプが割り当てられます.しかし、ANTLRでは、これらの文字列に一致する構文解析規則は作成されません.逆に、ANTLRは、これらの文字列を構文解析器に関連付けられた文字定数テーブルに入力します.ANTLRは、文字定数テーブルに対してコードを生成して各タグのテキストを検出し、構文解析器のタグの処理を手動でオフにする前に一致を得ると、タグのタイプが変更されます.手動検出も実行できます.自動コード生成は、構文解析器オプションで制御できます.
エラープロセッサの同期部分など、これらの文字列定数のタグのタイプ値を動作で使用したい場合があります.アルファベット文字のみからなる文字列定数の場合、この文字列定数の値はLITERAL_のような形になります.xxxの定数値、ここでxxxはこのマークの名前です.たとえば、文字「return」にはLITERAL_があります.return値を関連付けます.タグセクション(tokens section)でこの文字に特定の記号を割り当てることもできます.
タグ参照
大文字で始まる識別子をタグ参照と呼びます.次の文字は、任意の文字、数値、または下線です.構文アナライザ・ルールのタグ参照によって、特定のタグが一致します.構文解析器でのタグ参照により、タグの文字に一致する構文規則が呼び出されます.すなわち、構文解析器でのタグ参照は、ペアをルール参照として使用します.
タグ定義
構文解析器でのタグ定義は、構文規則と同じ定義になります.しかし、文法規則ではなくマークとして扱われます.たとえば、
class MyParser extends Parser;
idList : ( ID )+;   // parser rule definition
 
class MyLexer extends Lexer;
ID : ( 'a'..'z' )+ ;   // token definition    

ルール参照
小文字で始まる識別子はANTLRの構文規則です.次の文字は、任意のアルファベット、数値、または下線です.文法規則は文法規則を参照できません.
动作
カッコ内の文字列は意味動作(ネストされている可能性があります).文字列と文字の括弧は、アクションセパレータではありません.
アクションパラメータ
カッコ内の文字列は、動作パラメータ(ネストされている可能性があります)です.文字列と文字の括弧は、アクションセパレータではありません.[]のパラメータは、生成された言語の構文で定義され、カンマで区切られます.
codeBlock
[int scope, String name] // input arguments
returns [int x]          // return values
: ... ;
 
// pass 2 args, get return
testcblock
{int y;}
         :         y=cblock[1,"John"]
         ;

多くの人は私たちが普通のかっこでパラメータを囲むのが好きですが、カッコはEBNFで文法グループ記号(grammatical grouping symbols)を定義するのによく使われています.
記号の下の表は、ANTLRで使用される句読点とキーワードを集計しています.
アイコン
説明
(...)
サブルール
(...)*
閉饅頭ルール(ゼロと複数)
(...)+
正閉饅頭ルール(1つと複数)
(...)?
オプション(0個と1個)
{...}
セマンティックアクション
[...]
ルール・パラメータ
{...}?
意味述語
(...)=>
構文述語
|
オプション
..
レンジキャラクタ
~

.
ワイルドカード
=
に値を付ける
:
ラベル、ルール開始
;
ルールの終了
<...>
要素オプション
class
構文クラス
extends
構文ベースクラスの指定
returns
戻りタイプの指定
options
optionsセクション
tokens
tokensセクション
header
ヘッダーセクション
tokens
token定義セクション