はまった件(2)
semantic prediction がうまくいかない。はまってたらこんな時間に。
semantic predictionは字句解析器とかにフィールド作っておいて、そのフィールドの値によってDFAの遷移情報とかを捻じ曲げるという趣旨のもので、かなり便利げ。ただ、想定ケースがANTLR作者と異なっててはまってました。
これは同一の字句に対して複数の種類のトークンを作るのが趣旨らしく、最長一致のルールはsemantic predictionより強い模様。
つまり、
type_arguments : TYPE_ARG_START type (',' type)* TYPE_ARG_END ; TYPE_ARG_START // 型の解析中のみ発動 : {parsingType}? '<' ; TYPE_ARG_END // 型の解析中のみ発動 : {parsingType}? '>' ; OPERATOR // 型の解析中でないときのみ発動 : {!parsingType}? ( '<' | '>' | '<<' | '>>' | '=' ) ;
ってのがあって、「List>」とかを食わせると大変。たとえparsingTypeがtrueであっても、
- List: NAME
- List: NAME
- ?:WILDCARD
- >>:OPERATOR
と、最長一致してしまおうとした上、semantic predictionが遅れて検査されて落ちます。さらにこれら全部DFAで処理されるので、状態遷移図を自分で起こさないとデバッグがきつい。
IrenkaのQueryはちょっといい加減な対処法つかっちゃいました。単純に演算子を1文字に制限して、構文のほうで1文字ずつの演算子トークンを結合するイメージ。semantic predictionで途中にホワイトスペースがあれば失敗させればよさげ。
いずれ直す。