antlrノート

4100 ワード

antlrノート
 
antlrの少しのノート、少し、そしてllとantlrのいくつかのドキュメント
 
LL(K)文法
LL文法は上から下への分析法で、文法の開始記号から、あるいは木の根から、文法書を下に構築し、木の葉ごとに構築することを知っています.再帰的降下分析法とも呼ばれる.
 
不確定な上から下へ:
ll本質的には,一致する文字列(合法入力)または貧乏終了(非合法入力)が見つかるまで,特定の文法記号から貧乏挙動を開始する.
llの各ステップは、現在の文型の最左非端末(通常は常に大文字を表す)であり、複数の記号がある場合、1つずつ試みるしかなく、試行に失敗した場合、もちろん元の文字列に遡るので、遡及分析方法と呼ばれる.効率が悪い.
 
非確定プッシュダウンオートマトン:
文字列を入力して、頭を読んで、貧乏状態の自動機があって、先進的に後にスタックを押します.本質は入力後にステータスマシンをあるステータスに到達させることです
 
ll文法はどのように左再帰を除去しますか:
1.拡張BNFバーコス様式で
0~n回出現することを{}で表す
[]で0または1回表示
隔離共通因子A->x(y|w|.|z)を()で表す
2.直接書き換え、左再帰をなくす
一言U→UxIy
U→yU 1に変更
    U1 →  xU1|null
 
LL(k)文法は文脈に関係のない文法の真のサブセットである.
LL(k)文法も、決定された左から右へのスキャン(入力列)と上から下への分析技術を採用することを可能にする最大の文法である.   
 
LR文法は,下から上への解析法であり,与えられた入力列から,あるいは文法書の末端から,ルートノードまで上へ規約する.演算子優先分析法とも呼ばれる
 
Antlrノート
記号^!
 , CalcParser,  : 
class CalcParser extends Parser;
 options { buildAST = true; // //   CommonAST } 
expr: mexpr (PLUS^ mexpr)* SEMI! ; 
mexpr : atom (STAR^ atom)* ; 
atom: INT ; 
PLUS STAR , , '^'。SEMI '!', 。

 
Antlr構文規則
class MyParser extends Parserは識別器であり、構文ツリーを生成する
デフォルトの生成ツリーのルールは、次のように小文字です.
expr: mexpr (PLUS^ mexpr)* SEMI! ;
mexpr : atom (STAR^ atom)* ;
atom: INT ;

 
Class MyLexer extends Lexerは語法分析器で、入力文を分割します
デフォルトでは、これらのtokenは大文字です.たとえば、次のようになります.
WS : (' ' | '\t' | '
' | '\r') { _ttype = Token。SKIP; } ; LPAREN: '(' ; RPAREN: ')' ; STAR: '*' ; PLUS: '+' ; SEMI: ';' ; INT : ('0'..'9')+ ; 

ここでfragment XXXは独立したtokenとすることができず、tokenに埋め込まれるしかなく、マクロに相当する
次のようになります.
fragment EscapeSequence 
	:	'\\'
  	(	
  		'n' 
	|	'r' 
	|	't'
	|	'\'' 
	|	'\\'
	|	UnicodeEscape
	)
  ;

 
Class MyTressWalker extends TreeParserツリーの解析器
expr : 
#(PLUS expr expr) //PLUS , expr 
 | #(STAR expr expr) 
 | INT ;

アクションを埋め込むことができます
 
expr returns [int r] {
int a,b; r=0;
 }
 : 
#(PLUS a=expr b=expr) {r = a+b;}
 | #(STAR a=expr b=expr) {r = a*b;} 
 | i:INT {r = Integer.parseInt(i.getText());};

 
文法規則ノート:
(...)
 
(...)*
 ( )
(...)+
 ( )
(...)?
 ( )
{...}
 (action)
[...]
 
{...}?
 
(...)=>
 
|
 
..
 
~
 
.
 
=
 
:
 ,  
;
 
<...>
 
class
 
extends
 
returns
 
options
options  
tokens
tokens  
header
header  
tokens
token  

 token
 option
 
ruleでは^はtokenをサブヒールノードとして表し,以下にpowをpowerExpressionのヒールノードとする.
powerExpression 
	:	unaryExpression ( POW^ unaryExpression )*
	;

->コードを直接生成しないことを示します.これは言語の拡張を生成するためです.以下のようにします.
ast樹種ではサブツリーが生成されます.以下の例はcellgroupがルート、cell logicalExpressionがサブノードです.
cellGroup
	:	CELL'{' logicalExpression? '}' -> ^(CELLGROUP CELL logicalExpression?)
	;

直接書く場合:
cellGroup
:	CELL'{' logicalExpression? '}' 
        {
            System.out.println("CELLGROUP " + "CELL " + logicalExpression != null ? logicalExpression.toString() : "NULL");
        }
;

 
 
ありがとう http://www.cnblogs.com/vowei/archive/2012/12/29/2839286.html