Expr

ANTLR4: Expr

Exemplo:

grammar Expr;
stat : assign;
assign : ID ’= ’ expr ’;’ ;
expr : INT ;
ID : [a-z]+ ;
INT : [0-9]+ ;
WS : [ \t \r \n ]+ -> skip ;

Se executarmos o compilador criado com a entrada:

  • sp = 100;

Vamos obter a seguinte árvore sintática:

ANTLR4: contexto automático

Para facilitar a análise semântica e a síntese, o ANTLR4 tenta ajudar na resolução automática de muitos problemas (como é o caso dos visitors e dos listeners).

No mesmo sentido são geradas classes (e em execução os respectivos objectos) com o contexto de todas as regras da gramática:

ANTLR4: contexto automático (2)

ANTLR4: visitor

Os objectos de contexto têm a si associada toda a informação relevante da análise sintática (tokens, referência aos nós filhos da árvore, etc).

Por exemplo o contexto AssignContext contém métodos ID e expr para aceder aos respectivos nós.

No caso do código gerado automaticamente do tipo visitor o padrão de invocação é ilustrado a seguir:

ANTLR4: listener

O código gerado automaticamente do tipo listener tem o seguinte padrão de invocação:

A sua ligação à restante aplicação é a seguinte:

ANTLR4: atributos e acções

É possível associar atributos e acções às regras:

grammar ExprAttr ;
stat : assign ;
assign : ID ’=’ e=expr ’;’
{ System.out.println ( $ID.text + "="+ $e.v ); } //action;
expr returns [int v] : INT //result attribute named v in expr
{ $v = Integer.parseInt($INT.text); } //action
;
ID : [a-z]+ ;
INT : [0-9]+ ;
WS : [ \t \r \n ]+ -> skip ;

Ao contrário dos visitors e listeners, a execução das acções ocorre durante a análise sintática.

A execução de cada acção ocorre no contexto onde ela é declarada. Assim se uma acção estiver no fim de uma regra (como exemplificado acima), a sua execução ocorrerá após o respectivo reconhecimento.

A linguagem a ser executada na acção não tem de ser necessariamente Java (existem muitas outras possíveis, como C++ e python).

Também podemos passar atributos para a regra (tipo passagem de argumentos para um método):

assign: ID ’=’ e=expr[true] ’;’ //argument passing to expr
    { System . o u t . p r i n t l n ( $ID . t e x t +" = "+ $e . v ) ; }
    ;
expr[boolean a] // argument attribute named a in expr
    returns [ i n t v ] : // result attribute named v in expr
    INT {
        if ($a)
            System.out.println ( "Wow! Used in an assignment !");
            $v = Integer.parseInt( $INT.text );
    };

É clara a semelhança com a passagem de argumentos e resultados de métodos.

Diz que os atributos são sintetizados quando a informação provém de sub-regras, e herdados quando se envia informação para sub-regras.

Last updated