Compiladores/Aula Prática 02/Exemplos: Difference between revisions

From Wiki**3

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..."
 
Root (talk | contribs)
No edit summary
Line 34: Line 34:
     void accept(basic_ast_visitor *sp, int level) {
     void accept(basic_ast_visitor *sp, int level) {
         sp->do_sweep_node(this, level);
         sp->do_sweep_node(this, level);
    }
    // other functions
};
</source>
}}
== Exemplo 2: with-run-between-and-stepping ==
=== 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.
'''with''' ''variable'' '''run''' ''instruction'' '''between''' ''expression'' '''and''' ''expression'' '''stepping''' ''expression''
''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.
with i run print(i) between f()/3 and f()/2 stepping 0.1
=== Solução ===
{{CollapsedCode|AST node: with_node|
<source lang="c++">
class with_node : public cdk::basic_node {
    cdk::lvalue_node *_variable;
    cdk::basic_node *_instruction;
    cdk::expression_node *_between;
    cdk::expression_node *_and_expression;
    cdk::expression_node *_step;
public:
    sweep_node(int lineno, cdk::lvalue_node *variable, cdk::basic_node *instruction, cdk::expression_node *between, cdk::expression_node *and_expression, cdk::expression_node *step) :
        basic_node(lineno), _variable(variable), _instruction(instruction), _between(between), _and_expression(and_expression), _step(step) {
            // EMPTY
    }
    void accept(basic_ast_visitor *sp, int level) {
        sp->do_with_node(this, level);
     }
     }
     // other functions
     // other functions

Revision as of 22:58, 11 March 2021

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
};

Exemplo 2: with-run-between-and-stepping

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.

with variable run instruction between expression and expression stepping expression

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.

with i run print(i) between f()/3 and f()/2 stepping 0.1

Solução

AST node: with_node
class with_node : public cdk::basic_node {
    cdk::lvalue_node *_variable;
    cdk::basic_node *_instruction;
    cdk::expression_node *_between;
    cdk::expression_node *_and_expression;
    cdk::expression_node *_step;

public:
    sweep_node(int lineno, cdk::lvalue_node *variable, cdk::basic_node *instruction, cdk::expression_node *between, cdk::expression_node *and_expression, cdk::expression_node *step) :
        basic_node(lineno), _variable(variable), _instruction(instruction), _between(between), _and_expression(and_expression), _step(step) {
            // EMPTY
    }

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