Compiladores/Aula Prática 02/Exemplos

From Wiki**3

< Compiladores‎ | Aula Prática 02
Revision as of 00:52, 12 March 2021 by Root (talk | contribs) (Created page with "== Exemplo 1: sweep-from-to-step-do == === Problema === Uma linguagem dispõe de uma instrução que corresponde a um ciclo que faz variar uma variável de controlo entre do...")

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Exemplo 1: sweep-from-to-step-do

Problema

Uma linguagem dispõe de uma instrução que corresponde a um ciclo que faz variar uma variável de controlo entre dois limites, utilizando um incremento variável. Na instrução abaixo, partes em negrito correspondem a palavras chave da linguagem e partes em itálico correspondem a partes variáveis.

sweep variable from expression to expression step expression do instruction

variable corresponde a uma variável inteira ou real, expression corresponde a uma expressão com tipo compatível com a variável e instruction corresponde a uma instrução que faz uso da variável.

Escreva a classe que representa o nó correspondente a esta instrução, indicando todos os seus atributos. Defina ainda a função de visita (accept). Além do nó pedido, não é necessário definir outros, devem ser usados os que são fornecidos com a CDK.

Um exemplo de uso é indicado a seguir. Supõe-se que i é uma variável real, que f() é uma chamada a uma função que devolve um valor real e que print(i) é uma chamada a uma função que aceita um valor real.

sweep i from f()/3 to f()/2 step 0.1 do print(i)

Solução

AST node: sweep_node
class sweep_node : public cdk::basic_node {
    cdk::lvalue_node *_variable;
    cdk::expression_node *_from;
    cdk::expression_node *_to;
    cdk::expression_node *_step;
    cdk::basic_node *_instruction;

public:
    sweep_node(int lineno, cdk::lvalue_node *variable, cdk::expression_node *from, cdk::expression_node *to, cdk::expression_node *step, cdk::basic_node *instruction) :
        basic_node(lineno), _variable(variable), _from(from), _to(to), _step(step), _instruction(instruction) {
            // EMPTY
    }

    void accept(basic_ast_visitor *sp, int level) {
        sp->do_sweep_node(this, level);
    }
    // other functions
};