Prof. José
de
Faça o
analisador léxico, sintático e a geração de código em C para uma pequena
linguagem de programação chamada MSI2 (Mais Simples Impossível2). Nesta
linguagem, todas as palavras-chave possuem apenas uma única letra, que é sempre
maiúscula. Há comandos de atribuição, impressão, leitura do teclado, decisão e
repetição, além do comando composto. As variáveis são todas as letras
minúsculas, automaticamente declaradas como inteiros, que é o único tipo. Antes
de mostrarmos os detalhes da linguagem, é interessante estudar um exemplo:
G n
G p
= i 0
W i # n
{
* a p i
P a
+ i i 1
}
Este
exemplo lê dois números do teclado, n e p, e imprime os n primeiros múltiplos
de p, começando por
#include <stdio.h>
int
main() {
int a, b, c, d, e, f, g, h, i, j, k, l, m, n,
o, p, q, r, s, t, u, w, x, y, z;
char str[512]; //
auxiliar na leitura com G
// G n
{ gets(str);
sscanf(str, "%d", &n);
}
// G p
{ gets(str);
sscanf(str, "%d", &p);
}
// = i 0
i = 0;
//W i # n {
while ( i != n ) {
// * a p i
a = p * i;
//
P a
printf("%d\n",
a);
// + i i 1
i = i + 1;
}
gets(str);
}
A gramática
da linguagem é dada abaixo.
Program ::= Command { Command }
Command ::=
AssignCommand | GetCommand
|
AddCommand | SubCommand | MultCommand |
DivCommand | ModCommand | PrintCommand |
IfCommand | WhileCommand | CompositeCommand
AssignCommand ::= “=” Variable Value
GetCommand ::= “G”
Variable
AddCommand ::= “+” Variable Value Value
SubCommand ::= “-” Variable Value Value
MultCommand ::= “*” Variable Value Value
DivCommand ::= “/” Variable Value Value
ModCommand ::= “%” Variable Value Value
PrintCommand ::= “P” Value
Comparison ::=
Variable Operator Value
Operator ::=
“=” | “<” | “#”
IfCommand ::= “I” Comparison Command
WhileCommand ::= “W”
Comparison Command
CompositeCommand ::= “{” Command { Command } “}”
Value ::= Variable| Number
Variable
é qualquer letra minúscula. Number é um número de um
único dígito. Note que, em execução, as variáveis podem conter números de mais
de um dígito. Um quadro mostrando os comandos em MSI2 e a tradução para C é
mostrado abaixo.
Comando |
código em
C |
= a b |
a = b; |
G a |
{ gets(str); sscanf(str, "%d", &n); } |
+ c d 1 |
c = d +
1; |
- x 2 4 |
x = 2 –
4; |
* a b c |
a = b*c; |
/ d n p |
d = n/p; |
% r n p |
r = n%p; |
P 5 |
printf("%d\n", 5); |
I a < n
P n |
if ( a < n ) { printf("%d\n", 5);
} |
W i <
n { P i + i i
1 } |
while ( i < n ) { printf("%d\n",
i); i = i + 1; } |
O
a) O analisador
b) O analisador
Você deve entregar, impressos:
Primeiro exemplo |
Segundo exemplo |
G
n G
p =
i 0 W
i # n { * a p i P a + i i 1 } |
G
n =
i 2 %
a n i W
i < n { I a = 0 = i n + i i 1 % a n i } I
a = 0 P 0 I
a # 0 P 1 |
O que faz mesmo o segundo exemplo ?