Você está na página 1de 8

1. A) Definição dos tokens.

%options flex case-insensitive

%%

[\r\n]+ return 'NL';

\s+ /* skip whitespace */

\#[^\r\n]* /* skip comments */

"Nao quero mais comprar" return 'DESISTENCIA';

[a-zA-Z]+ return 'NOME';

"Sou" return 'SOU';

"infelizmente" return 'INFILIZ';

"," return ',';

"registrado no CPF numero" return 'REGISTRADO';

"com residencia em" return 'RESIDENCIA';

"Comprar" return 'COMPRAR';

"Sou Supermax" return 'MSG1';

"Aguarde, vou validar o pedido." return 'MSG2';

"Grato por aguardar. Agora vou faturar o pedido e concluir sua compra." return 'MSG3';

"O valor total da compra foi de R$ " return 'MSG4';

"Obrigado, João Oliveira e Supermax." return 'MSG5';

"infelizmente Supermax não possui estoque para atender seu pedido." return 'MSG6';

"Obrigado pela preferência. Volte sempre!" return 'MSG7';

"cancelou a compra." return 'MSG8';

"Falha geral no processo por ordem incorreta das operações." return 'MSG9';

[0-9]+ return 'PRECO';

[0-9]+ return 'QUANTIDADE'

"(" return '(';

")" return ')';

[0-9]{3}.[0-9]{3}.[0-9]{3}-[0-9]{2} return 'CPF';


[0-9]{5}-[0-9]{3} return 'CEP';

<<EOF>> return 'EOF';

. return 'INVALID';

2. B e C

%{

function prependChild(node, child){

node.splice(2, 0, child);

return node;

%}

%start programa

%ebnf

%%

programa

: acoes+ EOF

%{

$$ = {

nodeType: 'PROGRAMA',

acoes: $1

};

return $$;

%}

acoes

: cliente_registro '.'? NL
;

cliente_registro

SOU NOME',' REGISTRADO CPF ',' RESIDENCIA CEP cliente_compra

%{

$$ = {

name: 'REGISTRO_CLIENTE',

nodeType: 'CLIENTE',

value: [$1, $2, $3, $4, $5, $6, $7, $8]

%}

| SOU NOME',' REGISTRADO CPF ',' RESIDENCIA CEP cliente_compra

%{

$$ = {

name: 'REGISTRO_CLIENTE',

nodeType: 'CLIENTE',

value: [$1, $2, $3, $4, $5, $6, $7, $8]

%}

| SOU NOME',' REGISTRADO CPF ',' RESIDENCIA CEP NL MSG2 NL MSG9

%{

$$ = {

name: 'REGISTRO_CLIENTE',

nodeType: 'CLIENTE',

value: [$1, $2, $3, $4, $5, $6, $7, $8]

%}

;
cliente_compra

COMPRAR produto '.'? NL loja_registro

%{

$$ = {

name: 'COMPRAR_PRODUTO',

nodeType: 'COMPRA',

value: [$1, $2, $3, $4, $5]

%}

| COMPRAR produto '.'? NL MSG1 '.' NL DESISTENCIA loja_registro

%{

$$ = {

name: 'COMPRAR_PRODUTO',

nodeType: 'COMPRA_RECUSADA',

value: [$1, $2, $3, $4, $5]

%}

loja_registro

MSG1 '.' NL MSG2 NL MSG3 loja_validacao

%{

$$ = {

name: 'LOJA_REGISTRO',

nodeType: 'LOJA_REGISTRO_EFETUADO',

value: [$1, $3, $5, $6]

}
%}

| MSG2 NL NOME ',' MSG7

%{

$$ = {

name: 'LOJA_REGISTRO',

nodeType: 'LOJA_REGISTRO_ERRO',

value: [$1, $3, $5, $6]

%}

| MSG1',' INFILIZ NOME MSG8 NL MSG7

%{

$$ = {

name: 'LOJA_REGISTRO',

nodeType: 'LOJA_REGISTRO_CANCELAMENTO',

value: [$1, $3, $5, $6]

%}

loja_validacao

MSG4 PRECO '.' NL MSG5

%{

$$ = {

name: 'LOJA_REGISTRO',

nodeType: 'LOJA',

value: [$1, $3, $5]

%}
;

produto

: NOME '(' QUANTIDADE ')'

%{

$$ = {

name: 'COMPRAR_PRODUTO',

nodeType: 'COMPRA',

value: [$1, $3]

%}

3. AST

var registro = false;

var compra = false;

var ceps = ['11111-111', '22222-222' '33333-333', '44444-444', '55555-555'];

var produtos = [

nome: 'Café',

preco: 10,

quantidade: 10

},

nome: 'Arroz',

preco: 14,

quantidade: 2

},
{

nome: 'Feijão',

preco: 8,

quantidade: 12

},

var interpretador = function (code) {

code.sentencas.forEach(function (sentenca) {

if (sentenca.name == 'REGISTRO_CLIENTE') {

for (var i = 0; i < ceps.length; i++) {

if(ceps[i] == sentenca.value[7]){

registro = true;

if (sentenca.name == 'COMPRAR_PRODUTO' && registro) {

for (var i = 0; i < produtos.length ; i++) {

if(produtos[i].quantidade > 0 && sentenca.value[2].value[1] == produtos[i].nome){

compra = true;

if (sentenca.nodeType == 'LOJA_REGISTRO_EFETUADO') {

alert(sentenca.value);
}

if (sentenca.nodeType == 'LOJA_REGISTRO_ERRO') {

alert(sentenca.value);

if (sentenca.nodeType == 'LOJA_REGISTRO_CANCELAMENTO') {

alert(sentenca.value);

if (sentenca.nodeType == 'LOJA_VALIDACAO') {

alert(sentenca.value);

});

};

Você também pode gostar