はまった件
メモ。
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が追加される。なんかパーサを手組みした方が早いんじゃないか疑惑が出てきたけど、まぁ保守性考えてってことで。