ここまできたら、とりあえず腕力で前に進む。
効率の良し悪しで言えば、明らかに悪いのだけど、
前提知識が大きく欠如している以上、動いているコードから、何をか判断せざるを得ないと言うワケ。
自動生成されたパーザや、レキサーが投げる例外は、全て、
- 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.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.MissingTokenException
- org.antlr.runtime.UnwantedTokenException
- org.antlr.runtime.MismatchedTreeNodeException
- tree grammar使用時なので、今回はナシ
- org.antlr.runtime.NoViableAltException
うむ。一部の例外を除いて、パーザとレキサーにとっちらかっている。
これは痺れる。どうしよ…
まぁ、上から一個ずつ例外が発生するテストコードを書きながら、潰していく感じで。