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