수색…


소개

청취자와 방문객의 차이점은 무엇입니까? 리스너와 방문자 메커니즘의 차이점은 ANTLR이 제공하는 워커 객체가 리스너 메소드를 호출하는 반면 방문자 메소드는 명시적인 방문 호출로 하위 클래스를 처리해야한다는 점입니다. 노드의 자식에서 visit ()을 호출하는 것을 잊어 버리면 해당 하위 트리가 방문되지 않는다는 것을 의미합니다. 방문객에게는 나무를 걷는 기능이 있습니다. 청자의 경우 나무 용 보행기에만 반응합니다.

문법 예제 (Expr.g4)

grammar Expr; 
prog:    (expr NEWLINE)* ;
expr:    expr ('*'|'/') expr

    |    expr ('+'|'-') expr
    |    INT
    |    '(' expr ')'
    ;
NEWLINE : [\r\n]+ ;
INT     : [0-9]+ ;

방문자 생성하기

방문자를 생성하거나 문법에 대한 방문자를 비활성화하려면 다음 플래그를 사용합니다.

 -visitor            generate parse tree visitor
 -no-visitor         don't generate parse tree visitor (default)

방문자와 함께 문법을 작성하는 명령 줄 / 터미널 명령은 선택한 별칭 및 가능한 별칭과 관련하여 아래와 같이 형식이 지정됩니다.

java - jar antlr-4.5.3-complete.jar Expr.g4 -visitor
java - jar antlr-4.5.3-complete.jar Expr.g4 -no-visitor

결과는 방문자가 있거나 방문자가없는 파서 / 렉서가됩니다.

출력 이 예제에서는 ExprBaseVisitor.javaExprVisitor.java 가 출력됩니다. 방문자 기능을 구현하는 데 필요한 관련 Java 파일입니다. 새로운 클래스를 생성하고 ExprBaseVisitor를 확장하여 각 메소드에 대한 새로운 방문자 기능을 구현하는 것이 이상적입니다.

// Generated from Expr.g4 by ANTLR 4.5.3
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;

/**
 * This class provides an empty implementation of {@link ExprVisitor},
 * which can be extended to create a visitor which only needs to handle a subset
 * of the available methods.
 *
 * @param <T> The return type of the visit operation. Use {@link Void} for
 * operations with no return type.
 */
public class ExprBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements ExprVisitor<T> {
    /**
     * {@inheritDoc}
     *
     * <p>The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.</p>
     */
    @Override public T visitProg(ExprParser.ProgContext ctx) { return visitChildren(ctx); }
    /**
     * {@inheritDoc}
     *
     * <p>The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.</p>
     */
    @Override public T visitExpr(ExprParser.ExprContext ctx) { return visitChildren(ctx); }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow