Pesquisar neste blog

Mostrando postagens com marcador Compiladores. Mostrar todas as postagens
Mostrando postagens com marcador Compiladores. Mostrar todas as postagens

10/11/2021

Fatorial #2 com MIPS Assembly

.data
prompt: .asciiz "Entre com num: "
factMsg: .asciiz "Fatorial = "
num: .word 0
.text

la $a0, prompt
li $v0, 4
syscall
li $v0, 5
syscall
sw $v0, num
move $a0, $v0
la $a0, factMsg
li $v0, 4
syscall
lw $a0, num
jal fact
move $a0, $v0
li $v0, 1
syscall
li $v0, 10
syscall

fact:
li $t0, 1
move $t1 $a0, 
loop:
beq $t1, $zero, exit
mul $t0, $t0, $t1
addi $t1, $t1, -1
j loop

exit:
move $v0, $t0
jr $ra

Simulador MARS 4.0


02/11/2021

Fatorial #1 com MIPS Assembly

.data
promptMessage: .asciiz "Entre com o número do fatorial: "
resultMessage: .asciiz "\nFatorial = "
theNumber: .word 0
theAnswer: .word 0
.text
.globl main
main:
#leia o número do usuário
li $v0, 4
la $a0, promptMessage
syscall
li $v0, 5
syscall
sw $v0, theNumber
#Chama a função fatorial
lw $a0, theNumber
jal findFactorial
sw $v0, theAnswer
#Exibi os resultados
li $v0, 4
la $a0, resultMessage
syscall
li $v0, 1
lw $a0, theAnswer
syscall
#Informa ao sistema que este é o fim do programa
li $v0, 10
syscall
#--------------------
# função findFactorial
.globl findFactorial
findFactorial:
subu $sp, $sp, 8
sw $ra, ($sp)
sw $s0, 4($sp)
#Base caso
li $v0, 1
beq $a0, 0, factorialDone
#findFactorial (o número -1)
move $s0, $a0
sub $a0, $a0, 1
jal findFactorial
#A mágia acontece aqui
mul $v0, $s0, $v0
factorialDone:
lw $ra, ($sp)
lw $s0, 4($sp)
addu $sp, $sp, 8
jr $ra

Saída gerada no MARS 4.5
























Palavras chave:

Factorial with MIPS Assembly
Factorial con ensamblaje MIPS
Faktoriell med MIPS-montering
פקטוריאלי עם MIPS Assembly
Silnia z zespołem MIPS
MIPS সমাবেশের সাথে ফ্যাক্টরিয়াল
Faktorial dengan Majelis MIPS
Факториал с MIPS монтаж
Factorial cu Asamblare MIPS

17/10/2021

Soma, subtração, divisão e multiplicação com MIPS Assembly

.data
#soma
num1: .asciiz "Digite o primeiro numero: "
num2: .asciiz "Digite o segundo numero: "
Resultado: .asciiz "Soma = "

#subtração
n1: .asciiz "\n\nDigite o 1° num: "
n2: .asciiz "Digite o 2° num: "
result: .asciiz "Subração = "

#divisão
x1: .asciiz "\n\nDigite o 1° número: "
x2: .asciiz "Digite o 2° número: "
Rdiv: .asciiz "Divisão = "

#multiplicação
k1: .asciiz "\n\nDigite o 1° número: "
k2: .asciiz "Digite o 2° número: "
Mult: .asciiz "Multiplicação = "
.text
li $v0, 4
la $a0, num1
syscall

li $v0, 5
syscall
move $t0, $v0

li $v0, 4
la $a0, num2
syscall

li $v0, 5
syscall
move $t1, $v0

#tendo os dois valores 
add $t2, $t0, $t1
li $v0, 4
la $a0, Resultado
syscall

li $v0, 1
move $a0, $t2
syscall

#subtração
li $v0, 4
la $a0, n1
syscall

li $v0, 5
syscall

move $t0, $v0 #move para o registrador

li $v0, 4
la $a0, n2
syscall

li $v0, 5
syscall

move $t1, $v0

sub $t2, $t0, $t1

li $v0, 4
la $a0, result
syscall

li $v0, 1
move $a0, $t2
syscall

#bloco da divisão
li $v0, 4
la $a0, x1
syscall

li $v0, 5
syscall

move $t0, $v0

li $v0, 4
la $a0, x2
syscall

li $v0, 5
syscall

move $t1, $v0
div $t0, $t1

mflo $s3 #pega o valor menor
li $v0, 4
la $a0, Rdiv
syscall

li $v0, 1
move $a0, $s3
syscall

#multiplicação
li $v0, 4
la $a0, k1
syscall

li $v0, 5
syscall

move $t0, $v0

li $v0, 4
la $a0, k2
syscall

li $v0, 5
syscall

move $t1, $v0

mult $t0, $t1

mflo $s3

li $v0, 4
la $a0, Mult
syscall

li $v0, 1
move $a0, $s3
syscall

Saída gerada




Loop de repetição com Mips MARS - Assembly

CÓDIGO FEITO NO MARS4

.data
pergunta: .asciiz "Digite a sua idade: "
msg1: .asciiz "Você é menor de idade\n"
msg2: .asciiz "Você é maior de idade\n"
.text
.globl prog #aponta para o programa principal

prog: # função principal
li $v0, 4 # imprimir uma string
la $a0, pergunta # a0 = pergunta
syscall # Executar
li $v0, 5 # Faz a leitura de um número inteiro
syscall # Executa
move $t1, $v0 # t1 = v0
beq $t1, $0, sair # Desvia para o bloco sair
blt $t1, 18, menor # Desvia para o bloco menor
bge $t1, 18, maior # Devia para o bloco maior
j prog # DESVIA PARA O BLOCO PROG

menor: 
li $v0, 4 # Imprimi uma string
la $a0, msg1 # a0 = msg1
syscall
j prog #DESVIA PARA O jprog

maior:
li $v0, 4 # IMPRIMI UMA STRING
la $a0, msg2 # a0 = msg2
syscall
j prog # DESVIA PARA O BLOCO PROG

sair:
li $v0, 10 # FINALIZAR
syscall # EXECUTAR

Saída gerada



31/12/2020

Projeto saldo de conta bancária em Linguagem MIPS Assembly

# PROJETO DO GERENCIADOR DE DEPÓSITOS E SAQUES

.data # diretiva de dados
sal: .asciiz "Informe o sado Inicial: "
menu: .asciiz "\n### MENU ###\n1 - Mostrar o saldo\n2 - Depositar\n3 - Efeturar o saque\n0 - Sair\nOpção: "
outsal: .asciiz "SALDO = "
outdep: .asciiz "Seu NOVO SALDO após o Depósito é: "
outdep2: .asciiz "Informe seu Depósito: "
outsaq: .asciiz "Seu NOVO SALDO após o Saque é: "
outsaq2: .asciiz "Informe seu Saque: "
out: .asciiz "Sistema Finalizado!\n"

.text # Diretiva de texto
.globl main # Diretiva global
main: # bloco main
li $v0, 4 # Imprimi uma string
la $a0, sal # Carrega sal no registrador a0
syscall
li $v0, 5 # le um número inteiro
syscall # Executa
move $t0, $v0 # Salva o número digitado em t0

rep: # bloco rep
li $v0, 4 # Imprimi uma string
la $a0, menu # Carrega o menu no registrador a0
syscall # executa
li $v0, 5 # le um numero inteiro
syscall
move $t1, $v0 # salv ao número digitado em t1
beq $t1, 0, sair # se t0 for 0, executa o bloco sair
jal opmenu # chama a função opmenu
j rep # cria o laço chamando rep

opmenu: # bloco menu
beq $t1, 1, saldo # se t1 for igual a 1, executa saldo
beq $t1, 2, deposito # se t1 for igual a 2, executado deposito
beq $t1, 3, saque # se t1 for igual a 3, execta saque

saldo: # bloco saldo
li $v0, 4 # Imprimi uma string
la $a0, outsal # Carrega outsal no registrador a0
syscall
li $v0, 1 # Imprimi um inteiro
move $a0, $t0 # Carrega a0 com o registrador t0
syscall
jr $ra # Volta para que o chamou (ja1)

deposito: # bloco deposito
li $v0, 4 # Imprimi uma string
la $a0, outdep2 # Carrega outdep2 no registrador a0
syscall
li $v0, 5 # le um número inteiro
syscall
move $t2, $v0 # Salva o número digitado em t2
add $t0, $t0, $t2 # SOMA t0 = t0 + t2
li $v0, 4 # Imprimi uma string
la $a0, outdep # Carrega otdep no registrador a0
syscall
li $v0, 1
move $a0, $t0 # Carrega o registrador a0 com t0
syscall
jr $ra # volta para que o chamou (ja1)

saque:
li $v0, 4 # Imprimi uma string
la $a0, outsaq2 # Carrega outdsaq2 no registrador a0
syscall
li $v0, 5 # le um número inteiro
syscall
move $t4, $v0 # Salva o número digitado em t4
sub $t0, $t0, $t4 # SUBTRAI t0 = t0 - t4
li $v0, 4 # Imprimi uma string
la $a0, outsaq # Carrega otdep no registrador a0
syscall
li $v0, 1
move $a0, $t0 # Carrega o registrador a0 com t0
syscall
jr $ra # volta para que o chamou

sair: # bloco sair
li $v0, 4
la $a0, out
syscall
li $v0, 10 # Sair do programa
syscall

Simulador: MARS 4.5


Calculadora em linguagem MIPS Assembly

.data
menu: .asciiz "***** MENU *****\n1 - Somar\n2 - Subtrair\n3 - Multiplicar\n4 - Dividir\n0 - SAIR\nOpção: "
n1: .asciiz "Entre com o primeiro número: "
n2: .asciiz "Entre com o segundo número: "
r: .asciiz "Resultado = "
pula: .asciiz "\n\n"

.macro pula_linha # Macro pula linha
li $v0, 4
la $a0, pula # Carrega a string de pula em $a0
li $v0, 4
la $a0, pula
syscall
.end_macro

.macro menu
li $v0, 4
la $a0, menu
syscall
li $v0, 5 # Prepara para ler um número inteiro
syscall
move $t0, $v0 # Salva o número digitado em $t0
.end_macro

.text # Diretiva de dados
.globl principal # Diretiva global

principal: # Função principal
menu # Chama a macro menu
# Condições
beq $t0, 1, somar # se $t0 for digitado 1 vai para o bloco somar
# Bloco somar
beq $t0, 2, subtrair
# bloco subtrair
beq $t0, 3, multiplicar
# bloco multiplicar
beq $t0, 4, dividir

beq $t0, 0, sair
# bloco sair

somar:
# pede o primeiro número
li $v0, 4
la $a0, n1 # Carrega n1 no registrador $a0
syscall
li $v0, 5
syscall
move $t1, $v0 
# pede o segundo número
li $v0, 4
la $a0, n2 # Carregga n2 no registrador
syscall
li $v0, 5
syscall
move $t2, $v0 # Salva o número digitado
add $t3, $t1 $t2 # SOMA: $t3 = t1 + t2
# Mostra o resultado na tela
li $v0, 4
la $a0, r # Carrega r no registrador $a0
syscall
li $v0, 1 # Imprimi m número
la $a0, ($t3) # Carrega o inteiro de $t3 em $a0
syscall
pula_linha # Executa a macro
j principal # Executa o bloco principal

subtrair: # Bloco subtrair
# pede o primeiro número
li $v0, 4 # Imprimi uma string
la $a0, n1 # Carrega n1 no registrador a0
syscall
li $v0, 5 # Lê um número inteiro
syscall
move $t1, $v0 # Salva o número digitado em $t1
# pede o segundo número
li $v0, 4 # Imprimir uma string
la $a0, n2 # Carrega n2 no registrador
syscall
li $v0, 5
syscall
move $t2, $v0 # Salva o número digitado em $t2
sub $t3, $t1, $t2 # SUBTRAI: t3 = t1 - t2
#MOSTRA o resultado na tela
li $v0, 4 # Imprimi uma string
la $a0, r # Carrega no registrador a0
syscall
li $v0, 1 # Imprimi um número
la $a0, ($t3) # Carrega o inteiro 
syscall
pula_linha # Executa a macro pula linha
j principal # Executa o bloco principal

multiplicar: # Bloco multiplicar:
# Pede o primeiro número
li $v0, 4 # Imprimi uma string
la $a0, n1 # Carrega n1 no registrador 
syscall
li $v0, 5 # Le um número inteiro
syscall
la $a0, ($t3) # Carrega o inteiro 
# Pede o segundo número
move $t1, $v0 # Salva o número digitado em $t1
la $a0, n2 # Carrega n2 no registrador 
syscall
li $v0, 5 # Lê um número inteiro
syscall
move $t2, $v0 # Salva o número digitado em $t2
mul $t3, $t1, $t2 # MULTIPLICA: t3 = t1 * t2
#Mostra o resultado na tela
li $v0, 4 # Imprimi uma string
la $a0, r # Carrega r no registrador $a0
syscall
li $v0, 1 # Imprimi um número inteiro
la $a0, ($t3) # Carrega o número inteiro de $t3 em $a0
syscall # Executa
pula_linha # Executa a macro pula_linha
j principal # Executa o bloco principal

dividir: # bloco dividir
# Pede o primeiro número
li $v0, 4 # Imprimi uma string
la $a0, n1 # Carrega n1 no registrador $a0
syscall
li $v0, 5 # Lê um número inteiro
syscall
move $t1, $v0 # Salva o número digitado em t1
# pede o segundo número
li $v0, 4 # Imprimi uma string
la $a0, n2 # Carrega n2 no registrador $a0
syscall
li $v0, 5 # Le um número inteiro
syscall
move $t2, $v0 # Salva o número digitado em t2
div $t3, $t1, $t2 # DIVIDE: t3 = t1 / t2
# Mostra o resultado
li $v0, 4 # Imprimi uma string
la $a0, r # Carrega no registrador a0
syscall
li $v0, 1 # Imprimi uma string
la $a0, ($t3) # Carrega um inteiro em a0
syscall
pula_linha
j principal
# bloco para sair
sair:
li $v0, 10
syscall



Simulador: MARS 4.5


23/12/2020

Número positivo ou negativo com loop em MIPS Assembly

Faca um programa que solicita do usuário um número inteiro. O programa deverá dizer se este número é positivo ou negativo se for zero.

Resolução:

.data
msgpositivo: .asciiz "Este número é positivo\n"
msgnegativo: .asciiz "Este número é negativo\n"
msg1: .asciiz "Digite um número: "
fim: .asciiz "Fim do programa!\n"
.text
li $v0 ,4 # prepara o registrador
la $a0, msg1 # a0 = msg1
syscall
li $v0, 5 # recebe um número inteiro
syscall
move $t0, $v0 # t0 = v0
beq $t0, $a0,sair #se t0 == 0, vai sair
jal verifica # vai para verificação

verifica: # função de verificação
bgt $t0, $0, maior # se t0 > 0, vai para maior
blt $t0, $a0, menor # se t0 < 0, vai para menor

maior:
li $v0, 4
la $a0, msgpositivo # a0 = msgpositivo
syscall
j sair # bloco de codigo, vai para sair

menor:
li $v0, 4
la $a0, msgnegativo # a0 = msgnegativo
syscall
j sair

sair: # bloco para sair
li $v0, 4 # imprime uma string
la $a0, fim # a0 = fim
syscall
li $v0, 10
syscall

Simulador: MARS 4.5


Condicional if em Linguagem MIPS Assembly

Faça um programa em MIPS Assembly que receba uma idade e identifique se ele é maior ou de menor idade.

Resolução:

.data
pergunta: .asciiz "Digite a sua idade: "
msg1: .asciiz "Você é menor de idade"
msg2: .asciiz "Você é maior de idade"

.text
li $v0, 4 # imprimir uma string
la $a0, pergunta # a0 = pergunta
syscall # Executar
li $v0, 5 # Faz a leitura de um número inteiro
syscall # Executa
move $t1, $v0 # t1 = v0
li $t0, 18 # t0 = 18
blt $t1, $t0, menor # Desvie se $t1 for menor do que 18 para o bloco menor
bge $t1, $t0, maior # Devie se $t1 for maior ou igual a 18 para o bloco maior

menor: 
li $v0, 4 # Imprimi uma string
la $a0, msg1 # a0 = msg1
syscall
li $v0, 10 # Finaliza o programa

maior:
li $v0, 4
la $a0, msg2 # a0 = msg2
syscall
li $v0, 10
syscall

Simulador: MARS 4.5


22/12/2020

Fração em linguagem MIPS Assembly

.data
x: .asciiz "Digie o valor de X: "
y: .asciiz "Digite o valor de Y: "
z: .asciiz "O resultado de X/Y = "
.text
li $v0, 4 # imprime uma string
la $a0, x # a0 = x
syscall # Executa
li $v0, 5 # Recebe um numero inteiro
syscall
move $t1, $v0 # t1 = v0
li $v0, 4
la $a0, y # a0 = y
syscall
li $v0, 5 # Imprime uma string
syscall
move $t2, $v0 # t2 = v0
div $t3, $t1, $t2 # t3 = t1/t2
li $v0, 4 #imprime um númeor inteiro
la $a0, z # a0 = z
syscall # executa
li $v0, 1 # Imprime um número inteiro
la $a0, ($t3) # a0 = t3
syscall
li $v0, 10 # prepara para finalizar
syscall

Simulador MARS 4.5


Cubo de um número usando MIPS Assebly

.data
numero: .asciiz "Digite um número: "
cubo: .asciiz "O cubo é = "
.text
li $v0, 4 # Imprimi uma string
la $a0, numero # a0 = numero
syscall # executa
li $v0, 5 # eitura de um número inteiro
syscall
move $t1, $v0 # t1 = v0
mul $t2, $t1, $t1 # t2 = t1 * t1
mul $t3, $t1, $t2 # t3 = t1 * t2
li $v0, 4 # imprimi uma string
la $a0, cubo # a0 = cubo
syscall
li $v0, 1 # imprime um número inteiro
la $a0, ($t3) # a0 = t3
syscall
li $v0, 10 # Finalizar o programa
syscall

Simulador MARS 4.5


20/12/2020

Corrida de São Silvestre em Linguagem Assembly

Construa um programa para ser colocado no relógio que utiliza um recurso GPS que ao ser pressionado um botão aparece no display quantos quilômetros já foram percorridos. A posição da largada sabendo que o percurso da corrida possui 15 Km, o display também deverá calcular quantos Km falta para concluir a corrida.

Resolução:

.data
kp: .asciiz "Digite o Km percorrido: "
kf: .asciiz "Km finais = "

.text
li $v0, 4 # imprimir uma string
la $a0, kp # a0 = kp
syscall # Execute
li $v0, 5 # Ler um número inteiro
syscall # Executa
move $t0, $v0 # t0 = v0
li $t1, 15 # t1 = 15
sub $t2, $t1, $t0 # t2 = t1 - t0

li $v0, 4 # Imprima uma string
la $a0, kf # a0 = kf
syscall
li $v0, 1
la $a0, ($t2) #a0 = t2
syscall # Executa


Soma com MIPS usando Linguagem Assembly

Soma de 2 números com leitura em MIPS Assembly.

Resolução:

.data
num1: .asciiz "Digite o primeiro numero: "
num2: .asciiz "Digite o segundo numero: "
Resultado: .asciiz "Soma = "
.text
li $v0, 4
la $a0, num1
syscall

li $v0, 5
syscall
move $t0, $v0

li $v0, 4
la $a0, num2
syscall

li $v0, 5
syscall
move $t1, $v0

#tendo os dois valores 
add $t2, $t1, $t0
li $v0, 4
la $a0, Resultado
syscall

li $v0, 4
la $a0, Resultado
syscall

li $v0, 1
move $a0, $t2
syscall


Simulador: MARS 4.5






19/12/2020

Olá Mundo no MARS em Linguagem MIPS Assembly #03

.data # diretiva data

.macro finalizarprograma
li $v0, 10 # prepara o programa para finalizar programa
syscall # executa
.end_macro

.macro printf(%str)
.data
# o conteúdo dessa variável mensagem será enviada por essa função print
msg: .asciiz %str # recebe uma string de fora
.text
li $v0, 4 # prepara o registrador para receber (imprimir) uma string
la $a0, msg # envia essa string para o registrador
syscall # executa executa
.end_macro # diretiva de finalização macro

.text
.globl principal

principal:
# será executada dentro da diretiva global
printf("Olá Mundo!\n") #chama a macro e passa uma string
finalizarprograma



Olá Mundo no MARS em Linguagem MIPS Assembly #02

# 2° exemplo com diretiva global
.data
msg: .ascii "Olá Mundo!"

.text
.globl principal # diretiva global

principal:
li $v0, 4 # prepara para receber uma string (v0 = 4
la $a0, msg # a0 = msg
syscall # executa
li $v0, 10 # finaliza o programa

Simulador MARS 4.5


Olá Mundo no MARS em linguagem MIPS Assembly #01

.data #faz as variáveis
msg: .asciiz "Ola Mundo!" #asciiz = tipo de variável
.text #diretiva de texto

#instrução para o registrador
li $v0, 4 #prepara o registrador para imprimir uma string
# a0 = msg
la $a0, msg #la = leitura do endereço de memória onde está o texto e inserir dentro do registrador a0
syscall #executa o procedimento
li $v0, 10 #prepara o processador para finalizar
syscall






01/11/2020

Gerador de código































(a + b) * (c + d) -e

MÉTODO 1

1- Movido a em R0, e o resultado é armazenado em R0
2- Adicionado b a R0 (como R0 contém a) e o resultado é armazenado em R0
3- Agora vamos armazenar R0 (a + b) em T1 e R0 se tornará livre
4- Aqui nós movemos c em R0
5- Vamos adicionar d a R0 (como R0 agora contém c) e o resultado é armazenado em Ro
6- Agora multiplicamos T1 (a + b) por Ro (agora contém c + d) e o resultado é armazenado em Ro
7- Aqui nós nutrimos e de Ro
8- O resultado é armazenado em T4 de R0

MÉTODO 2

1- Movido a em R0, e o resultado é armazenado em R0
2- Adicionado b a R0 (como R0 contém a) e o resultado é armazenado em R0
3- Aqui nós movemos c em R1
4- Vamos adicionar d a R1 (como R1 agora contém c) e o resultado é armazenado em Ro
5- Agora multiplicamos Ro (a + b) por R1 (já que Ro agora contém c + d) e o resultado é armazenado em R0 (Ro + Ro)
6- Aqui subtraímos e de R1
7- O resultado é armazenado em T4 de R1

12/12/2019

Analisador léxico e sintático em java

Clique aqui para fazer o download do arquivo feito em Java
Autor: Mateus Marques - IFMT - Engenharia da Computação - 2018/2


Clique aqui para fazer o download do arquivo feito em Java
Autor: Luis Alexandre - IFMT - Engenharia da Computação - 2018/2


Clique aqui para fazer o download do arquivo feito em Java
Autor: Tales - IFMT - Engenharia da Computação - 2019/2


Clique aqui para fazer o download do arquivo feito em Pyton
Autor: Adriano - IFMT - Engenharia da Computação - 2019/2

Clique aqui para fazer o download do arquivo feito em Pyton
Autor: Lucas - IFMT - Engenharia da Computação - 2019/2

25/10/2019

Gramática no Gals

Gramática 1
Clique aqui para fazer o download do arquivo feito no Gals
Autor: Tales - IFMT - Eng. da Computação

Gramática 2
Clique aqui para fazer o download do arquivo feito no Gals
Autor: Henrique - IFMT - Eng. da Computação

Gramática 3
Clique aqui para fazer o download do arquivo feito no Gals
Autor: Luis Fernando Sampaio - IFMT - Eng. da Computação
Arquivos disponível em: https://github.com/lsfs/compilador

Gramática 4
Clique aqui para fazer o download do arquivo feito no Gals

Gramática 5
Clique aqui para fazer o download do arquivo feito no Gals
Autor: Adriano - IFMT - Engenharia da Computação
Arquivos disponível em: https://drive.google.com/open?id=1w0kj_-NU27WJ_w6yTzLEIS-bOw0rFqED

Gramatica 6
Clique aqui para fazer o download do arquivo feito no Gals
Autor: Lucas  - IFMT - Engenharia da Computação
Arquivos disponivel em: https://drive.google.com/file/d/11VqWv7g5nSnwSKajY-bq7lFArNoGPNQi/view?usp=sharing

Arquitetura para Assembly



S → DB
D → final id “=“ [“-”] const”;” [1][5] |
Tipo id1 [6] [“=“ [“-”[15]] const [16][7]] [2] {“,” id2 [6][“=“ [-[15]] const[16][7]] [3]}* “;”
Tipo → int [8]| byte [9]| string [10]| boolean[11]
B → begin {C}* end
C → id[4] = Exp [12];” [15]| while [16] Exp [13] [17] ( C | B )[18] |
If [19]Exp [13] [20] ( C | B ) [else [21]( C | B ) ] [22]| “;” |
readln”,” id[4] [14];” | (write | writeln)”,” Exp [17]{“,” Exp [17] }* “;”
Exp → ExpS1 [18] [12] [ ( “<“ [20][13.1]| “>“ [20][13.2]| “<=“ [20][13.3]| “>=“ [20][13.4]| “==“ [21][13.5]| “!=“ [20][13.6]) ExpS2 [19] [22] [14]]
ExpS → [ “-”[8]] T1 [23][9]{ ( “+” [27][10.1]| “-” [28][10.2]| or [28][10.3]) T2 [24][30][11]}*
T → F1 [25][5]{ ( “*” [29][6.1]| “/” [29][36][6.2]| and [29][6.3]) F2 [26][31][7]}*
F → “(“ Exp [32])” [3]| not F1 [33][4] | const[34][2] | id [4][35][1]

[1] {se id.classe != vazio então ERRO
senao id.classe = classe_const }
[2] { se id1.classe != vazio então ERRO
senao id1.classe = classe_var}
[3] { se id2.classe != vazio então ERRO
senao id2.classe = classe_var}
[4] { se id.classe = vazio então ERRO}
[5] { id.tipo := const.tipo }
[6] { id.tipo = Tipo.t }
[7] { se id1.tipo != const.tipo E (id1.tipo != inteiro E const.tipo != byte OU id1.tipo != byte E const.tipo != inteiro) então ERRO }
[8] { Tipo.t = inteiro }
[9]{ Tipo.t = byte }
[10] { Tipo.t = string }
[11]{ Tipo.t = boolean }
[12] { se id1.tipo != exp.tipo E (id1.tipo != inteiro E exp.tipo != byte OU id1.tipo != byte E exp.tipo != inteiro) então ERRO }
[13] { se exp.tipo != logico então ERRO }
[14] { se id.tipo != inteiro E id.tipo != byte E id.tipo != string então ERRO }
[15] { D.neg = true }
[16] { se D.neg = true
então id.tipo = inteiro }
[17] { se exp.tipo != inteiro E exp.tipo != byte E exp.tipo != string então ERRO }
[18] { Exp.tipo = Exps.tipo }
[19] { se Exp.tipo != inteiro E ExpS.tipo != inteiro E Exp.tipo != byte E ExpS.tipo != byte E (Exp.tipo != inteiro E Exps.tipo != byte OU Exp.tipo != byte E Exps.tipo != inteiro)
então ERRO }
[20] { se Exps1.tipo = string então ERRO }
[21] { se Exps1.tipo != string E Exps1.tipo != inteiro E Exps1.tipo != byte então ERRO}
[22] { Exp.tipo = logico }
[23] { Exps.tipo = T1.tipo }
[24] { se Exps.tipo != T2.tipo E (Exps.tipo != inteiro E T2.tipo != byte OU Exps.tipo != byte E T2.tipo != inteiro) então ERRO }
[25] { T.tipo = F1.tipo }
[26] { se T.tipo != F2.tipo E (T.tipo != inteiro E F2.tipo != byte OU T.tipo != byte E F2.tipo != inteiro) então ERRO }
[27] { se T1.tipo != string E T1.tipo != inteiro E T1.tipo != byte então ERRO}
[28] { se T1.tipo = string então ERRO }
[29] { se F1.tipo = string então ERRO }
[30] { se T1.tipo = inteiro E T2.tipo = byte OU se T1.tipo = byte E T2.tipo = inteiro
então ExpS.tipo = inteiro }
[31] { se F1.tipo = inteiro E F2.tipo = byte OU se F1.tipo = byte E F2.tipo = inteiro
então T.tipo = inteiro }
[32] { F.tipo = Exp.tipo }
[33] { se F1.tipo = string então ERRO
senão F.tipo = F1.tipo}
[34] { F.tipo = const.tipo }
[35] { F.tipo = id.tipo }
[36] { se (F1.tipo != inteiro) então F1.tipo = inteiro
        se (F2.tipo != inteiro) então F2.tipo = inteiro }

[1] { F.end := id.end }
[2] {se const.tipo=string então
                dseg SEGMENT PUBLIC
                byte "const.lex$"
                dseg ENDS
                F.end := cont_dados
                cont_dados+= 256
senão
                F.end:=NovoTemp
                mov regA, const.lex
                mov F.end, regA }
[3] { F.end := Exp.end }
[4] { F.end := NovoTemp }
{ mov regA, Fi.end }
{ not regA }
{ mov F.end, regA}
[5] { T.end := F1.end }
[6.1] {T.op = *}
[6.2] {T.op = /}
[6.3] {T.op = and}
[7] { mov ax, DS:[T.end] }
{mov bx, DS:[F2.end] }
{ se T.tipo != inteiro então
         cwd
se F2.tipo != inteiro entao
         mov cx, DS:[ax]
         mov ax, DS:[bx]
         cwd
         mov DS:[bx], ax
         mov DS:[ax], cx}
{se T.op = “*” então
         imul bx
senao se T.op = “/” então
         idiv bx
senao
       and ax, bx}
{ T.end := NovoTemp }
{ mov DS:[T.end], ax }
[8] { Exps.neg = true }
[9] { se Exps.neg = true
        Exps.end = NovoTemp
        mov ax, DS:[T1.end]
                neg ax
                mov DS:[Exps.end], ax}
{ ExpS.end := T1.end }
[10.1] { Exps.op =  + }
[10.2] { Exps.op =  - }
[10.3] { Exps.op =  or }
[11]  { mov ax, DS:[Exps .end] }
{ mov bx, DS:[T2.end] }
{ se Exps.tipo != inteiro então
    cwd
se T2.tipo != inteiro entao
    mov cx, DS:[ax]
         mov ax, DS:[bx]
         cwd
         mov DS:[bx], ax
         mov DS:[ax], cx}
{se Exps.op = “+” então
         imul bx
senao se Exps.op = “-” entao
         idiv bx
senao
         and ax, bx}
{ Exps.end := NovoTemp }
{ mov DS:[Exps.end], ax }
[12] { Exp.end = Exps1.end }
[13.1] { Exp.op = “<” }
[13.2] { Exp.op = “>” }
[13.3] { Exp.op = “<=” }
[13.4] { Exp.op = “>=” }
[13.5] { Exp.op = “==” }
[13.6] { Exp.op = “!=” }
[14] { mov ax, DS:[Exp.end]
mov bx, DS:{Exps2.end]
cwd
mov cx, DS:[ax]
mov ax, DS[bx]
cwd
mov DS:[bx],ax
mov DS:[ax],cx }
{ cmp ax, bx }
{ RotVerdadeiro = NovoRot }
{ se Exp.op = “=” então
      je RotVerdadeiro
senao se Exp.op = “!=” então
      jne RotVerdadeiro
senao se Exp.op = “<” então
      jl RotVerdadeiro
senao se Exp.op = “>” então
      jg RotVerdadeiro
senao se Exp.op = “>=” então
      jge RotVerdadeiro
senao
      jle RotVerdadeiro }
{ mov al, 0 }
{ RotFim = NovoRot }
{ jmp RotFim }
{ RotVerdadeiro: }
{ mov AL, 0FFh }
{ RotFim: }
{ Exp.end:=NovoTemp }
{ Exp.tipo:=TIPOLÓGICO }
{ mov Exp.end, AL }
[15] { mov ax, DS:[Exp.end] }
{ se id.tipo != Exp.tipo então
      cwd }
{ mov DS:[id.end], ax }
[16] { RotInicio:=NovoRot }
{ RotFim:=NovoRot }
{ RotInicio: }
[17] { mov ax, DS:[Exp.end] }
{ cmp ax, 0
      je RotFim }
[18] { jmp RotInicio }
{ RotFim: }
[19] { RotFalso:=NovoRot }
{ RotFim:=NovoRot }
[20] { mov ax, DS:[Exp.end] }
{ cmp ax, 0
      je RotFalso }
[21] { jmp RotFim }
{ RotFalso: }
[22] { RotFim: }