1

私はantlr 4を初めて使用し、文法を書いたことがありません。文法は短いサンプルに対してうまく機能するように見えますが、完了せずに一晩実行される長いサンプルがいくつかあります。入力ファイルで TestRig を使用しています。私は JVisualVM を使用し、コードがほとんどの時間をここで費やしていることを観察しました。

Org.antlr.v4.runtime.atn.ArrayPredictionContext.equals(Object) (89.8%)
Org.antlr.v4.runtime.atn.SingletonPredictionContext.equals(Object) (7.4%)
Org.antlr.v4.runtime.misc.DoubleKeyMap.put(Object,Object,Object) (1.8%)
Org.antlr.v4.runtime.misc.DoubleKeyMap.get(Object, Object) (0.9%)

この問題は、次の形式のステートメントの量に関連していると思われます。

reservedWord  = quotedstring

これらの 12 から 72 の間のどこかで問題が発生します

私はjvmに2Gのメモリを与えましたが、1G未満しか使用していません。ヒープは拡大縮小するので、メモリリークはないと思います。

このようなものをデバッグする方法について何かアドバイスはありますか?

ファイルを添付する方法がわかりません。スタック トレースは 422 行で、ほとんどが 1278 と 1325 を繰り返しています。TestRig を理解していないので、何をしているのかわかりません。見つけられれば、antlr-4.0-complete.jar のソース コードを取得します。

at org.antlr.v4.runtime.atn.PredictionContext.hashCode(PredictionContext.java:121)  
at org.antlr.v4.runtime.atn.SingletonPredictionContext.equals(SingletonPredictionContext.java:97)   
at java.util.HashMap.getEntry(HashMap.java:349)     
at java.util.LinkedHashMap.get(LinkedHashMap.java:280)  
at org.antlr.v4.runtime.misc.DoubleKeyMap.get(DoubleKeyMap.java:60)     
at org.antlr.v4.runtime.atn.PredictionContext.mergeSingletons(PredictionContext.java:204)   
at org.antlr.v4.runtime.atn.PredictionContext.merge(PredictionContext.java:138)     
at org.antlr.v4.runtime.atn.ATNConfigSet.add(ATNConfigSet.java:354)     
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1293)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)   
<repeat a lot 1278 and 1325>

at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1325)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1325)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1261)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1325)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1261)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1325)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1325)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1261)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1325)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)   
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure(ParserATNSimulator.java:1216)    
at org.antlr.v4.runtime.atn.ParserATNSimulator.computeReachSet(ParserATNSimulator.java:988)     
at org.antlr.v4.runtime.atn.ParserATNSimulator.execATNWithFullContext(ParserATNSimulator.java:801)  
at org.antlr.v4.runtime.atn.ParserATNSimulator.execATN(ParserATNSimulator.java:701)     
at org.antlr.v4.runtime.atn.ParserATNSimulator.predictATN(ParserATNSimulator.java:389)  
at org.antlr.v4.runtime.atn.ParserATNSimulator.adaptivePredict(ParserATNSimulator.java:346)     
at ValidatingPolicyParser.showstatement(ValidatingPolicyParser.java:1023)   
at ValidatingPolicyParser.statement(ValidatingPolicyParser.java:685)    
at ValidatingPolicyParser.policy(ValidatingPolicyParser.java:246)   
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)    
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)    
at java.lang.reflect.Method.invoke(Method.java:597)     
at org.antlr.v4.runtime.misc.TestRig.process(TestRig.java:247)  
at org.antlr.v4.runtime.misc.TestRig.process(TestRig.java:209)  
at org.antlr.v4.runtime.misc.TestRig.main(TestRig.java:142)

テストケースとして使用するために、簡略化された文法に取り組み始めました。この演習は、文法から取り除いたいくつかの奇妙な点を特定するのに役立ちました. これにより、削除された文法の問題は解決されましたが、完全な文法を復元すると、パフォーマンスの問題が再発しました。

単純な比較の発生回数を増やすと、処理時間が非線形に増加するのは、私には本当に奇妙に思えます。「TOKEN = "SOMESTRING" OR TOKEN = "SOMEOTHERSTING"」のいくつかのインスタンスは比較的迅速に処理されますが、これらの比較が 75 あると、処理時間が非常に長くなります。

antlr4 のソースがどこかにあるかどうかはわかりません。コードをステップ実行して、何が起こっているかを確認するとよいでしょう。

このプロセスを繰り返して、結果がどうなるか見てみようと思います。

4

2 に答える 2

1

それらのタイミング図は役に立ちません。彼らはあなたにイプシロンを教えてくれます。

代わりに、中断してください。あなたは行為でそれをキャッチします。コール スタックと、必要に応じてデータ変数を調べます。その時点で何をしているのかを理解すれば、何が問題なのかがわかります。

あなたがそれについて知りたいと思っていた以上のもの。

于 2013-04-10T13:29:44.403 に答える
0

さて、私は自分の文法に問題を見つけました。多くの試行錯誤を繰り返しました。再帰はantlr4で使用されているのだろうか?

于 2013-04-11T17:58:31.190 に答える