ここまできたら、とりあえず腕力で前に進む。

効率の良し悪しで言えば、明らかに悪いのだけど、
前提知識が大きく欠如している以上、動いているコードから、何をか判断せざるを得ないと言うワケ。


自動生成されたパーザや、レキサーが投げる例外は、全て、

  • org.antlr.runtime.RecognitionException

のサブクラスになっている事に着目しる。
んで、既に生成されているコードを前提に、
eclipseのCall Hierarchyプラグインを使って無理矢理調べる。
プラグインがバグって無ければ、例外が発生しうる箇所を全網羅出来る筈。


で、こんな感じになった。

  • org.antlr.runtime.EarlyExitException
    • TwoWaySqlParser.charactors()
    • TwoWaySqlParser.inbindchars()
    • TwoWaySqlLexer.mIDENT()
    • TwoWaySqlLexer.mLT()
    • TwoWaySqlLexer.mQUOTED()
    • TwoWaySqlLexer.mWHITE_SPACES()
    • TwoWaySqlParser.nodelist()
  • org.antlr.runtime.FailedPredicateException
    • TwoWaySqlLexer.mC_ED()
    • TwoWaySqlLexer.mC_LN_ED()
    • TwoWaySqlLexer.mC_LN_ST()
    • TwoWaySqlLexer.mC_ST()
    • TwoWaySqlLexer.mIN()
    • TwoWaySqlLexer.mLT()
  • org.antlr.runtime.MismatchedRangeException
    • org.antlr.runtime.Lexer.matchRange(int, int)
  • org.antlr.runtime.MismatchedSetException
    • TwoWaySqlParser.charactors()
    • TwoWaySqlParser.inbindchars()
    • TwoWaySqlLexer.mBEGIN()
    • TwoWaySqlLexer.mCHAR()
    • TwoWaySqlLexer.mELSE()
    • TwoWaySqlLexer.mEND()
    • TwoWaySqlLexer.mIF()
    • TwoWaySqlLexer.mIN()
    • TwoWaySqlLexer.mLT()
    • TwoWaySqlLexer.mQUOTED()
    • TwoWaySqlLexer.mSYM_Q()
    • TwoWaySqlLexer.mSYMBOLS()
    • TwoWaySqlLexer.mWS()
  • org.antlr.runtime.MismatchedNotSetException
    • ナシ
  • org.antlr.runtime.MismatchedTokenException
    • org.antlr.runtime.Lexer.match(int)
    • org.antlr.runtime.Lexer.match(String)
    • org.antlr.runtime.BaseRecognizer.mismatch(IntStream, int, BitSet)
    • org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken(IntStream, int, BitSet)
  • org.antlr.runtime.MissingTokenException
    • org.antlr.runtime.BaseRecognizer.mismatch(IntStream, int, BitSet)
    • org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken(IntStream, int, BitSet)
  • org.antlr.runtime.UnwantedTokenException
    • org.antlr.runtime.BaseRecognizer.mismatch(IntStream, int, BitSet)
    • org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken(IntStream, int, BitSet)
  • org.antlr.runtime.MismatchedTreeNodeException
    • tree grammar使用時なので、今回はナシ
  • org.antlr.runtime.NoViableAltException
    • TwoWaySqlParser.begincomment()
    • TwoWaySqlParser.elsecomment()
    • TwoWaySqlParser.elseifcomment()
    • TwoWaySqlParser.endcomment()
    • TwoWaySqlLexer.mC_LN_ST()
    • org.antlr.runtime.DFA.noViableAlt(int, IntStream)
    • TwoWaySqlLexer.DFA8.specialStateTransition(int, IntStream)


うむ。一部の例外を除いて、パーザとレキサーにとっちらかっている。
これは痺れる。どうしよ…
まぁ、上から一個ずつ例外が発生するテストコードを書きながら、潰していく感じで。