2013-02-06 1 views
0

파 및 친애하는 사회,ANTLR4 :. 처음에는 getInterpreter() adaptivePredict

를 호출 할 때 잘못된 성능 나는 (전체 :-)로하고 ANTLR에 대한) 놀라운 Antlr4 주셔서 감사하고 싶습니다. 지난 6 개월 동안 Antlr 3을 사용 해왔다. (나는 이미 매우 행복했다.)하지만 antlr4로 더 행복하다. 자바를 타겟 언어로 사용하여 문법의 단순성과 생성 시간면에서 상당한 향상을 발견했습니다. 불행히도 antlr3에는없는 런타임 성능에 대한 우려가 있습니다. 여기

내 문법의 발췌 : 여기

declare_specs 
: 
DECLARE? declare_spec+ 
| 
DECLARE 
; 

declare_spec 
: 
constant_declaration 
| variable_declaration 
| exception_declaration 
| procedure_body 
| function_body 
; 

생성 된 코드는 (내가 추적을위한에서 System.out.println 추가) : 여기

public final Declare_specsContext declare_specs() throws RecognitionException { 
      System.out.println("TIME: " + timestamp() + " - declare_specs - 1"); 
     Declare_specsContext _localctx = new Declare_specsContext(_ctx, getState()); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 2"); 
     enterRule(_localctx, 118, RULE_declare_specs); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 3"); 
     int _la; 
     try { 
      int _alt; 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 4"); 
     setState(826); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 5"); 
     switch (getInterpreter().adaptivePredict(_input,69,_ctx)) { 
      case 1: 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 6"); 
       enterOuterAlt(_localctx, 1); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 7"); 
       { 

         if (f_trace >= f_trace_low) { 
          System.out.println("TIME: " + timestamp() + " - DECLARE_SPECS - FIRST ALT"); 
         }; 

       setState(817); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 8"); 
       _la = _input.LA(1); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 9"); 
       if (_la==DECLARE) { 
        { 
        setState(816); match(DECLARE); 
        } 
       } 

     System.out.println("TIME: " + timestamp() + " - declare_specs - 10"); 
       setState(820); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 11"); 
       _errHandler.sync(this); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 12"); 
       _alt = getInterpreter().adaptivePredict(_input,68,_ctx); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 13"); 
       do { 
        switch (_alt) { 
        case 1: 
         { 
         { 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 14"); 
         setState(819); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 15"); 
         declare_spec(); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 16"); 
         } 
         } 
         break; 
        default: 
         throw new NoViableAltException(this); 
        } 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 17"); 
        setState(822); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 18"); 
        _errHandler.sync(this); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 19"); 
        _alt = getInterpreter().adaptivePredict(_input,68,_ctx); 
     System.out.println("TIME: " + timestamp() + " - declare_specs - 20"); 
       } while (_alt!=2 && _alt!=-1); 
       } 
       break; 

      case 2: 
       enterOuterAlt(_localctx, 2); 
       { 

         if (f_trace >= f_trace_low) { 
          System.out.println("TIME: " + timestamp() + " - DECLARE_SPECS - SECOND ALT"); 
         }; 

       setState(825); match(DECLARE); 
       } 
       break; 
      } 
     } 
     catch (RecognitionException re) { 
      _localctx.exception = re; 
      _errHandler.reportError(this, re); 
      _errHandler.recover(this, re); 
     } 
     finally { 
      exitRule(); 
     } 
     return _localctx; 
    } 

흔적 :

................ 
TIME: 2013-02-06 09:47:10.417 - declare_specs - 12 
TIME: 2013-02-06 09:47:11.023 - declare_specs - 13 
................. 
TIME: 2013-02-06 09:51:38.915 - DECLARE_SPEC - AFTER 
................. 
TIME: 2013-02-06 09:51:38.916 - declare_specs - 19 
TIME: 2013-02-06 09:52:31.435 - declare_specs - 20 
................... 
TIME: 2013-02-06 09:52:31.435 - DECLARE_SPEC - INIT 

_alt = getInterpreter()를 호출 할 때 나는 60 ''을 잃고 있습니다. adaptivePredict (_input, 68, _ctx); _alt = getInterpreter()를 호출 할 때 두 번째이지만 1 '보다 작음 adaptivePredict (_input, 68, _ctx); 처음으로. 변경된 사항은 물론 _input 및 _ctx 매개 변수입니다.

문제는 대부분 내 문법에 있지만, 나는 지혜로 끝납니다 .--). 1. 해결책을 찾을 수있는 곳을 알려주시겠습니까? 2. 어쨌든 adaptivePredict에서 어떤 현상이 발생합니까?

도움을 주셔서 감사합니다. 당신이 내다 매우 많은 양의 필요 및/또는 애매한 상황에 민감 문법의 결정을 가지고있는 것처럼

종류에 관해서는, 볼프강 망치는

+0

죄송합니다, 친애하는 미스터 파 및 친애하는 커뮤니티 –

답변

0

소리가 난다. 불행하게도 우리는 완전한 문법을 ​​보지 않고 어느 것을 말할 수 없습니다. 할 수있는 일은 콘솔에 대한 모호성에 대한 자세한 정보를 출력하는 다음과 같습니다.

parser.addErrorListener(new DiagnosticErrorListener()); 
parser.getInterpreter().setPredictionMode(PredictionMode.LL_EXACT_AMBIG_DETECTION); 
+0

안녕 Helotes이 이 응답 해 주셔서 감사합니다! 3 가지 종류의 오류가 있습니다. 1. reportAttemptingFullContext d = nnn, input = 'xxx'2. reportContextSensitivity d = nnn, input = 'xxx' 3. reportAmbiguityd = nnn : ambigAlts = {1, n, ...}, input = 'xxx' 코드를 살펴 보았습니다. d는 DFA의 결정이며 입력은 분명합니다. 문법에서 d (결정)에서 잘못된 규칙으로 어떻게 갈 수 있습니까? 심지어 가능할까요? 'ParserATNSimulator'클래스의 코드는 꽤 복잡합니다. 도움을 주셔서 감사합니다. 친절함에 대해 Wolfgang Hämmer –