IF文をパース出来る様になったり。

コメントとテキストを分割出来る様になったので、
次は、条件分岐をパース出来る様にしてみる。

grammar Comment;

options {
	language = Java;
	output = AST;
	ASTLabelType = CommonTree;
}

queries : query EOF;

query 	:
	(charactors | comment | WS | LT)+
	;

charactors : (CHAR)+ ;

comment :
	begincomment
	| ifcomment
	| blockcomment
	| linecomment
	;

blockcomment :
	'/*' (charactors | WS | LT)+ '*/'
	;

linecomment :
	'--' (charactors | WS)+ (LT|EOF)
	;

ifcomment :
	'/*' IF expression '*/' query (elsecomment query)* endcomment
	;
	
elsecomment :
	('/*' ELSE expression? '*/' | '--' ELSE expression? LT)
	;

expression :
	(charactors | WS | LT)+
	;

begincomment :	
	'/*' BEGIN '*/' query endcomment
	;
	
endcomment :
	'/*' END '*/'
	;

CHAR	: ('0'..'9'|'a'..'z'|'A'..'Z') ;
LT
	: '\n'		// Line feed.
	| '\r'		// Carriage return.
	| '\u2028'	// Line separator.
	| '\u2029'	// Paragraph separator.
	;
WS	: '\t' | '\v' | '\f' | ' ' | '\u00A0';
BEGIN	: WS* 'BEGIN' WS*;	
IF	: WS* 'IF' WS*;
ELSE 	: WS* 'ELSE' WS*;
END	: WS* 'END' WS*;

大体、こんな感じの文字列を食わせてみるナリ。

a  /*aa hoge
 piro*/  fuga
/*BEGIN*/
 /*IF aa bb*/moge piro /*ELSE ccc*/ccc
	/* ELSE */ zzz
 /*END*/
	-- moge
/* END*/

結構いい感じにツリーが出来た。

これなら、後はゴリゴリと自前でwalk出来そうな感じ。
少し慣れてきた感があって、今使ってる機能だけなら、結構好き勝手に定義できる処まで理解できたかも。


endcommentをLexerで処理すると、何故か、elsecommentがちゃんと動いてくれない不思議。
Lexerで処理するべき部分と、Paserで処理するべき部分は、キチンと切り分けないといけないみたいだけど、
イマイチ違いを理解していない希ガス