はまった件

メモ。

ANTLRのパーサはFOLLOW(1)集合の計算をちゃんとやってる模様。

文法全体を計算して「FOLLOW(1) ∩ {EOF} = {}」なルールを作ってしまうと、単体で呼び出せなくなることが判明。その際はNoViableAltExceptionがスローされる。


回避策:

wildcard
  : '?' wildcard_rest
  ;

wildcard_rest
  : 'extends' type -> ^(WILDCARD ^(EXTENDS type))
  | 'super' type   -> ^(WILDCARD ^(SUPER type))
  |                -> ^(WILDCARD ^(JUST)) // ここの選択にEOFが含まれない
  ;

上のような文法があれば、次を加えとく。

wildcard_standalone__
  : wildcard EOF -> wildcard
  ;

こうすると、wildcard_restのFIRST(1)にwildcard_standalone__から流れるEOFが追加される。なんかパーサを手組みした方が早いんじゃないか疑惑が出てきたけど、まぁ保守性考えてってことで。