はまった件(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で途中にホワイトスペースがあれば失敗させればよさげ。

いずれ直す。