2013-09-22 2 views
1

antlr4를 사용하여 간단한 문법 검사에 오류를 기록하려고합니다.Antlr4, 특정 구문 오류를보고하는 방법

문법 그 자체는 함수로 구성됩니다.

FUNCTION hello (n){ 
    ...... 
} 
FUNCTION main (n) { 
    ...... 
} 

즉, 나는 여기에

내 ErrorListener를이

모습입니다 함수 이름, 또는 없는 주요 기능, 누락 같은 특정 오류를 잡을 생각하는 방법을 잘 모르겠습니다
import org.antlr.v4.runtime.*; 
import org.antlr.v4.runtime.tree.*; 

public class SimpleErrorListener extends BaseErrorListener { 
    @Override 
    public void syntaxError(Recognizer<?, ?> recognizer, 
      Object offendingSymbol, 
      int line, 
      int charPositionInLine, 
      String msg, 
      RecognitionException e) { 
     List<String> stack = ((Parser) recognizer.getRuleInvocationStack(); 
     Collections.reverse(stack); 
     System.err.println("rule stack: " + stack); 
     System.err.println("line" + line + ":" + 
      charPositionInLine + "at" + offendingSymbol + ": " + msg); 
    } 
} 

또한 콘솔 오류 수신기를 제거하고 이것을 추가하십시오. 네,하지만 그 특정 오류를 다루는 방법을 모르겠습니다. 제안 사항에 감사드립니다. 고마워.

답변

1

보고 의미 오류는 구문 오류보고보다 훨씬 쉽습니다. 구문 오류에 대한 사용자 지정보고를 원할 경우 구문 오류가 의미 오류가되도록 문법을 변경해야합니다. 예를 들어, 현재이 같은 함수를 구문 분석하는 경우 :

function : FUNCTION ID '(' ... 

그럼 대신 다음과 같은 규칙 중 하나를 사용하여 구문 오류로 "함수 이름을 누락"설정할 수 있습니다 :

function : FUNCTION ID? '(' ... 

// alternate 
function : FUNCTION (ID | /*missing function name; reported in listener*/) '(' ... 

주를이 당신의 문법은 당신이 점점 더 특별한 경우를 추가함에 따라 관리하기 어려워집니다.

+0

안녕하십니까, @ 280Z28, 고맙습니다. ID로 편집하려고 했습니까? 내 문법에 있지만보고하지 않습니다. 함수 : "FUNCTION"ID? 인수 변수 블록; – 4af2e9eb6

+0

그리고 나서 msgList가 ErrorListener에 어떤 메시지를 생성하는지 확인하려고 시도했습니다. if (msg.contains ("ID가 필요합니다")) System.out.println ("Error : function name undefined"); -> 그것은 올바른 접근 방법인지 잘 모르겠지만 보고서를했습니다 :) – 4af2e9eb6

+0

누락 된 main 함수 및 중복 함수 이름 오류에 대해 모든 함수 이름을 로컬 HashSet에 추가하는 등의 문법에 몇 가지 조건을 추가했습니다. 중복이 있으면 오류를보고합니다. 그러나 술어를 사용하면 둘 이상의 오류 메시지가 발생할 수 있습니다.이 기능을 사용하여 10 개의 기능이 있고 그 중 어느 것도 주요 기능이 아닌 경우 10 개의 오류 메시지를 인쇄하므로 올바른 방법이라고 생각하지 않습니다. : ( – 4af2e9eb6