2017-12-21 24 views
0

스캔 컨텍스트 내에서 텍스트를 스캔 할 때 유익한 결과물을 출력 할 수 있도록하려면 무엇을 재정의, 연장, 청취, 방문해야합니까?Antlr 4 :이 출력 형식을 사용할 수 있습니까?

-- Example output only --------- 
DEBUG ... current mode: DEFAULT_MODE 
DEBUG ... matching text '#' on rule SHARP ; pushing and switching to DIRECTIVE_MODE 
DEBUG ... matching text 'IF" on rule IF ; pushing and switching to IF_MODE 
DEBUG ... matching text '   ' on rule WS; skipping 
DEBUG ... no match for text % 
DEBUG ... no match for text & 

DEBUG ... mathcing text '\r\n' on rule EOL; popping mode; current mode: DIRECTIVE_MODE 
... 

감사

+0

지금까지 내가 당신이 렉서의 디버그 메시지를보고 싶어 이해 상태. 나는 렉서 문법이 DFA로 변하기 때문에 이것이 불가능하다고 생각한다. DFA는 상태 전이를 최적화하여 효율적이지만 더 이상 문법 규칙에 해당하지 않습니다. – CoronA

+0

아마도 문법을 게시해야합니다. 예제 출력은 파서에서 렉서 (lexer)와 파서 (parser)에서 너무 많이 수행하려고 시도한다는 사실을 지적합니다. 파서에서는 디버그 출력이나 디버그 출력을 배치하는 것이 더 쉽습니다. – CoronA

+0

맞습니다. 렉싱이 진행되는 동안 설명적인 디버그 메시지를 출력하는 방법을 찾고 있습니다. 내 문법은 중요하지 않습니다. 무엇이 스캔되었는지, 결과가 무엇인지, 어떤 모드가 밀렸는지, 현재 모드가 무엇인지 등을 알고 싶습니다. –

답변

0

이 솔루션은 내가 생각했던 것보다 훨씬 간단했다. 생성 된 Lexer를 서브 클래스 화하고 popMode(), pushMode()와 같은 메서드를 재정 의하여 원하는 출력을 얻습니다. 이 작업을 수행하는 경우 emit() 메서드를 재정 의하여 올바른 순차적 및 상황 별 정보를 얻어야합니다.

class ExtendedLexer : MyGeneratedLexer 
{ 
public ExtendedLexer(ICharStream input) 
    : base(input) { } 
public override int PopMode() 
{ 
    Console.WriteLine($"Mode is being popped: Line: {Line} Column:{Column} ModeName: {ModeNames[ModeStack.Peek()]}"); 
    return base.PopMode(); 
} 
public override void PushMode(int m) 
{ 
    Console.WriteLine($"Mode is being pushed: Line: {Line} Column:{Column} ModeName: {ModeNames[m]}"); 
    base.PushMode(m); 
} 
public override void Emit(IToken t) 
{ 
    Console.WriteLine($"[@{t.TokenIndex},{t.StartIndex}:{t.StopIndex}, <{Vocabulary.GetSymbolicName(t.Type)}> = '{t.Text}']"); 
    base.Emit(t); 
} 

} 같은

그리고 출력을 볼 수있는 작품 : 여기에

는 C#의 예입니다

Mode is being pushed: Line: 4 Column:3 ModeName: IF_MODE 
[@-1,163:165, <IF> = '#IF'] 
Mode is being pushed: Line: 4 Column:4 ModeName: CONDITION_MODE 
[@-1,166:166, <LPAREN> = '('] 
[@-1,167:189, <EXP> = '@setStartDateAndEndDate'] 
Mode is being popped: Line: 4 Column:28 ModeName: IF_MODE 
[@-1,190:190, <RPAREN> = ')']