"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 방문자를 사용하여 ANTLR 4에서 If/Else 문을 구현하는 방법은 무엇입니까?

방문자를 사용하여 ANTLR 4에서 If/Else 문을 구현하는 방법은 무엇입니까?

2024-11-09에 게시됨
검색:167

How to Implement If/Else Statements in ANTLR 4 using Visitors?

ANTLR 4의 If/else 문

ANTLR 4는 기본적으로 리스너를 사용하지만 방문자도 지원합니다. 방문자는 구문 분석 트리 탐색에 대해 더 많은 제어를 제공하므로 if/else 문을 구현하는 데 더 적합합니다. 방문자를 활성화하려면 다음 명령을 실행합니다:

java -cp antlr-4.0-complete.jar org.antlr.v4.Tool Mu.g4 -visitor

이렇게 하면 MuBaseVisitor라는 클래스가 생성됩니다. 는 원하는 기능을 구현하기 위해 확장할 수 있습니다. 다음은 EvalVisitor 클래스의 예입니다.

public class EvalVisitor extends MuBaseVisitor {

    // Override visit methods for each rule that needs to be implemented

    // Example: visitIf_stat for handling if/else statements
    @Override
    public Value visitIf_stat(MuParser.If_statContext ctx) {
        List conditions = ctx.condition_block();
        boolean evaluatedBlock = false;

        for (MuParser.Condition_blockContext condition : conditions) {
            Value evaluated = this.visit(condition.expr());
            if (evaluated.asBoolean()) {
                evaluatedBlock = true;
                this.visit(condition.stat_block()); // Evaluate the true block
                break;
            }
        }

        if (!evaluatedBlock && ctx.stat_block() != null) {
            this.visit(ctx.stat_block()); // Evaluate the else block
        }

        return Value.VOID;
    }
}

여기에서는 조건을 반복하고 첫 번째 참 조건을 평가합니다. true인 조건이 없고 else 블록이 있는 경우 이를 대신 평가합니다.

이 방문자를 사용하려면 입력을 구문 분석하고 평가하는 Main 클래스를 만듭니다.

public class Main {
    public static void main(String[] args) throws Exception {
        MuLexer lexer = new MuLexer(new ANTLRFileStream("test.mu"));
        MuParser parser = new MuParser(new CommonTokenStream(lexer));
        ParseTree tree = parser.parse();
        EvalVisitor visitor = new EvalVisitor();
        visitor.visit(tree); // Start the evaluation process
    }
}
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3