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で処理するべき部分は、キチンと切り分けないといけないみたいだけど、
イマイチ違いを理解していない希ガス。