2011年2月24日 星期四

ANTLR筆記

[ lexer | parser | tree ] grammer Name : ANTLR宣告,Name必須與檔名相同。

=====

options { ... } : ANTLR的設定值

  • language = Java; 此為預設值,改語言直接改等號右邊的內容即可,注意大小寫。
  • tokenVocab = xxxLexer for rule, or xxxParser for tree。

=====

@header { ... } : 產生出的java檔的表頭

  • 通常放import或package的定義等
  • 可以更進階的定義成 @parser::header { ... } or @lexer::header { ... },這樣就能分開定義在分開的檔案中。

=====

@members { ... } : 定義產生出的類別"成員與方法",也就是等於在裡面直接寫target language code的意思。

=====

若在重覆的規則中,要取得每個重覆的值,可以:

ee returns [int value]    
:   a1=INTT {$value+=Integer.parseInt($a1.text);}    
('+' a2=INTT {     
$value+=Integer.parseInt($a2.text);          
System.out.println($value);        
}
)+NEWLINE             ;

上述的重點在於a2的左右大括號必須在()+內撰寫,這樣才能取得每一次的值,否則在()+後寫,會只找到最後一個值。

=====

如果要取一個parser邏輯的所有內容,則可以使用$text即可。例如:
statement:
'if' parExpression a1=statement ('else' statement)?      {     System.out.println("node: " + "if");     System.out.println("status: " + "else");     System.out.println("statement: " + $a1.text);    
}

這裡的$a1.text是指第一個statement,但如果直接印出$text就會出現與這個規則符合的全部字串。

=====

 

 

 

 

 

 

沒有留言:

張貼留言