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);
}
}
또한 콘솔 오류 수신기를 제거하고 이것을 추가하십시오. 네,하지만 그 특정 오류를 다루는 방법을 모르겠습니다. 제안 사항에 감사드립니다. 고마워.
안녕하십니까, @ 280Z28, 고맙습니다. ID로 편집하려고 했습니까? 내 문법에 있지만보고하지 않습니다. 함수 : "FUNCTION"ID? 인수 변수 블록; – 4af2e9eb6
그리고 나서 msgList가 ErrorListener에 어떤 메시지를 생성하는지 확인하려고 시도했습니다. if (msg.contains ("ID가 필요합니다")) System.out.println ("Error : function name undefined"); -> 그것은 올바른 접근 방법인지 잘 모르겠지만 보고서를했습니다 :) – 4af2e9eb6
누락 된 main 함수 및 중복 함수 이름 오류에 대해 모든 함수 이름을 로컬 HashSet에 추가하는 등의 문법에 몇 가지 조건을 추가했습니다. 중복이 있으면 오류를보고합니다. 그러나 술어를 사용하면 둘 이상의 오류 메시지가 발생할 수 있습니다.이 기능을 사용하여 10 개의 기능이 있고 그 중 어느 것도 주요 기능이 아닌 경우 10 개의 오류 메시지를 인쇄하므로 올바른 방법이라고 생각하지 않습니다. : ( – 4af2e9eb6