파 및 친애하는 사회,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에서 어떤 현상이 발생합니까?
도움을 주셔서 감사합니다. 당신이 내다 매우 많은 양의 필요 및/또는 애매한 상황에 민감 문법의 결정을 가지고있는 것처럼
종류에 관해서는, 볼프강 망치는
죄송합니다, 친애하는 미스터 파 및 친애하는 커뮤니티 –