Difference between revisions of "Compiladores/Aula Prática 02/Exemplos"

From Wiki**3

< Compiladores‎ | Aula Prática 02
(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...")
 
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 00:58, 12 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
};