2010-12-28 8 views
0

以下の文法を定義しました。結果は成功したが、私ははAntlrで文法を定義します

A=(1,1) 
B=(1,2) 

G=(A,E) 

を書くならば、それはEではないというエラーを与え、私は例を持っている

A=(1,1) 
B=(1,2) 

G=(A,B) 

ように、この文法をチェックインする方法

grammar Sample_1; 


@header { 
    package a; 
} 

@lexer::header { 
    package a; 
} 

program 
    : 
     define* 
     implement* 
    ; 


define 
    : IDENT '=(' INTEGER',' INTEGER ')' 
    ; 

implement 
    :IDENT '=(' (IDENT ','?)* ')' 
    ; 

fragment LETTER : ('a'..'z' | 'A'..'Z') ; 
fragment DIGIT : '0'..'9'; 
INTEGER : DIGIT+ ; 
IDENT : LETTER (LETTER | DIGIT)*; 
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN;}; 
COMMENT : '//' .* ('\n'|'\r') {$channel = HIDDEN;}; 

定義 ありがとう

結果: 私は私を得たトン作業のおかげでたくさん:

grammar Sample_1; 

@members{ 
    int level=0; 
} 

@header { 
    package a; 
} 

@lexer::header { 
    package a; 
} 

program 
    : 
     block 
    ; 
block 
scope { 
    List symbols; 
} 
@init { 
    $block::symbols=new ArrayList(); 
    level++; 
} 
@after { 
    System.err.println("Hello"); 
    level--; 
} 
    : (define* implement+) 
    ; 

define 
    : IDENT {$block::symbols.add($IDENT.text);} '=(' INTEGER',' INTEGER ')' 
    ; 

implement 
    :IDENT '=(' (a=IDENT 
    {if (!$block::symbols.contains($a.text)){ 
    System.err.println("undefined"); 
    }}','?)* ')' 
    ; 

fragment LETTER : ('a'..'z' | 'A'..'Z') ; 
fragment DIGIT : '0'..'9'; 
INTEGER : DIGIT+ ; 
IDENT : LETTER (LETTER | DIGIT)*; 
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN;}; 
COMMENT : '//' .* ('\n'|'\r') {$channel = HIDDEN;}; 
+0

つまり、文法の評価はコンテキストに依存しますか? – Anon

+0

はい、実装がどれくらい難しいのかわかりません – Eldeus

+0

'H =(A、3)'と書くことも許されていますか? –

答えて

3

ANTLRはアクション、文法ファイルに埋め込まれたコードの小さなスニペットをサポートしています。

割り当てのアクションはマップに格納できます。右側のIDENTのアクションは、マップから値を取得しようとする可能性があり、失敗した場合は例外をスローする可能性があります。

Terrence Parrの「The Definitive ANTLR Reference」の第6章では、アクションについて説明しています。

+0

+1は含まれません。 "ANTLRの意味では、セマンティック述語を使って文脈依存の構造を認識することができます。アクションはtrueまたはfalseと評価されます。代替案を適用する妥当性。 –

+0

私は本を見ました:そして次のことをすることができましたが、さらに進んでいません:@ memembers { \t Map symbols = new HashMap(); } \t \t プログラム\t:\t \t \tが* \tを実装* \t \tを定義します。 \t:\t a = IDENT {symbols.put($ a);} '=(' INTEGER '、' INTEGER ')' \t; \t \t:IDENT '=('(IDENT '、'?)* ')' \t; Andyのおかげで – Eldeus

+0

:本のpg 153には必要な例がありました。 – Eldeus

関連する問題