2016-09-04 2 views
0

에서 규칙을 트리거 토큰을 감지 :나는이 아주 간단한 문법을 ​​가지고 ANTLR4

public class DLRBaseListener implements DLRListener { 

@Override public void enterDlr(DLRParser.DlrContext ctx) { } 

@Override public void exitDlr(DLRParser.DlrContext ctx) { } 

@Override public void enterC(DLRParser.CContext ctx) { } 

@Override public void exitC(DLRParser.CContext ctx) { } 

@Override public void enterEveryRule(ParserRuleContext ctx) { } 

@Override public void exitEveryRule(ParserRuleContext ctx) { } 

@Override public void visitTerminal(TerminalNode node) { } 

@Override public void visitErrorNode(ErrorNode node) { } 

}

: 나는 antlr4 명령을 사용하여 자바 코드를 생성 할 때, 나는 자바 인터페이스 DLRBaseListener있어
grammar DLR; 
dlr : c 'sub' c ; 
c : CN | 'not' c | c 'and' c | c 'or' c ; 
CN : [A-Z]+ ; 
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines 

특히 규칙이 트리거되는시기를 감지하려는 경우이 인터페이스를 확장 할 수 있습니다. 따라서 enterDlr, exitDlr, enterC 및 exitC와 같은 메소드는 매우 유용합니다. 내 목표는 구체적입니다. 규칙을 트리거하는 책임이있는 토큰을 감지하고 싶습니다. 나의 예에서는 'c, c'가 아니라 'c, c'또는 'c'입니다. 보시다시피 인터페이스에는 이러한 메소드가 없습니다. 문법의 해당 부분을 감지하는 방법이 있습니까?

+0

문법을 제어 할 수 있습니까? –

답변

1

ANTLR4이 기능을 달성하기 위해 "보조 라벨"(TDAR의 PG 117, 261)를 제공한다 : 공구가 라벨들 각각에 대해 별도의 파서 컨텍스트 (자바 규칙 콘텍스트 서브)를 생성

c : CN   # justCN 
    | 'not' c  # notC 
    | c 'and' c # andC 
    | c 'or' c # orC 
    ; 

을 레이블 이름을 기반으로 한 이름을 가진 대안. 그리고 대응하는 입력/종료 리스너 메소드.