Académique Documents
Professionnel Documents
Culture Documents
Sum
ario
1 Introduc
ao
1.1 Aspectos basicos da compilacao
1.2 Analise Lexica . . . . . . . . . .
1.3 Tabela de Smbolos . . . . . . .
1.4 Analise Sintatica . . . . . . . .
1.5 Analise Semantica . . . . . . . .
1.6 Tratamento de erros . . . . . .
1.7 Geracao de codigo intermediario
1.8 Otimizacao geral . . . . . . . .
1.9 Otimizacao local . . . . . . . .
1.10 Geracao de codigo objeto . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
5
6
7
7
8
8
8
9
9
2 An
alise L
exica
2.1 Revisao de Alfabeto, Gramatica e Linguagem
2.1.1 Alfabeto (ou vocabulario) . . . . . . .
2.1.2 Linguagens . . . . . . . . . . . . . . .
2.1.3 Gramatica . . . . . . . . . . . . . . . .
2.1.4 Gramatica Regular . . . . . . . . . . .
2.1.5 Gramatica Livre de Contexto . . . . .
2.1.6 Derivacao . . . . . . . . . . . . . . . .
2.1.7 Arvores
de Derivacao . . . . . . . . . .
2.1.8 Gramatica Ambgua . . . . . . . . . .
2.1.9 Exerccios . . . . . . . . . . . . . . . .
2.2 Lex/Flex - Geradores e Analisadores Lexicos .
2.2.1 Metacaracteres Lex . . . . . . . . . . .
2.2.2 Alguns Exemplos de Lex . . . . . . . .
2.3 Analisador Lexico para Linguagem Simples . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10
10
10
11
11
11
11
12
12
12
15
15
16
19
20
.
.
.
.
.
.
.
.
27
27
28
28
29
32
38
41
48
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 An
alise Sint
atica
3.1 Analise LL . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1 Funcao F IRST . . . . . . . . . . . . . . . . .
3.1.2 Funcao F OLLOW . . . . . . . . . . . . . . .
3.2 Analise LR . . . . . . . . . . . . . . . . . . . . . . .
3.2.1 Implementacao do Algoritmo LR . . . . . . .
3.2.2 Construcao da Tabela de Analise Sintatica LR
3.3 Yacc/Bison - Geradores e Analisadores Sintaticos . .
3.4 Analisador Sintatico para a Linguagem Simples . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
4 MVS - M
aquina Virtual Simples
53
4.1 Caractersticas gerais da MVS . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.1.1 Descricao das instrucoes MVS . . . . . . . . . . . . . . . . . . . . . 54
5 An
alise Sem
antica e Gerac
ao de C
odigo
5.1 Funcoes Utilitarias . . . . . . . . . . . .
5.2 Modificacao do analisador lexico . . . . .
5.3 Modificacao do analisador sintatico . . .
5.4 Simulador da Maquina MVS . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
61
61
63
64
69
.
.
.
.
.
.
.
.
.
.
.
.
.
.
74
74
74
76
78
78
78
79
80
81
81
83
84
85
87
Captulo 1
Introdu
c
ao
Com os computadores surgiu a necessidade de linguagens de programacao para quebrar
a barreira de comunicacao entre o homem e a maquina. As primeiras linguagens de
programacao foram chamadas linguagens de montagem (assembly languages).
Na decada de 50 surgiram as linguagens de alto nvel FORTRAN e Algol 60. Desde
entao surgiram centenas de linguagens para facilitar a especificacao de tarefas para o
computador.
Com a introducao das linguagens de alto nvel, surgiu a necessidade de programas
tradutores, ou seja, sistemas para converter programas fonte (escritos em linguagem que
pode ser entendida pelo usuario humano) para programa objeto (em linguagem que pode
ser entendida pela maquina.
1.1
Aspectos b
asicos da compila
c
ao
CAPITULO 1. INTRODUC
AO
CAPITULO 1. INTRODUC
AO
(compilacao num u
nico passo). Na compilacao em varios passos a execucao de uma fase
termina antes da execucao das fases seguintes. Numa compilacao em um passo, o programa objeto e gerado a` medida que o programa fonte e processado.
Para compilacao numa u
nica passada pode-se utilizar o esquema de traducao dirigido
por sintaxe. Nesse modelo, o codigo principal do compilador esta no analisador sintatico.
No meio das regras de producao da gramatica do analisador sintatico sao includos comandos (acoes semanticas) que sao executados concomitantes com as verificacoes sintaticas.
Essas acoes servem tanto para as verificacoes semanticas, como para geracao do codigo
objeto correspondente as estruturas sintaticas compiladas.
No projeto do compilador proposto nesse curso usaremos esta u
ltima alternativa de
compilacao com auxlio de algumas ferramentas (flex e bison) para automatizar a construcao dos analisadores lexico e sintatico.
Para a construcao do analisador lexico usaremos a ferramenta flex, que transforma
os padroes lexicos especificados usando expressoes regulares, no codigo fonte de uma
automato finito que reconhece esses padroes.
Para construcao do analisador sintatico usaremos a ferramenta bison, que transforma
o arquivo fonte com a gramatica livre de contexto da linguagem, no automato de pilha
que reconhece essa linguagem.
1.2
An
alise L
exica
A analise lexica e executada pelo Analisador Lexico ou scanner, e tem como objetivo
principal identificar e classificar, dentro do arquivo fonte, os smbolos pertencentes a
linguagem. Suas funcoes sao:
1. Fazer uma varredura no texto em todas as linhas do texto, de cima para baixo e da
esquerda para direita.
2. Agrupar os caracteres consecutivos que compoe o mesmo smbolo lexico e que tem
uma significado u
nico no programa, como as palavras reservadas, constantes, identificadores, smbolos especiais, operadores.
3. Atribuir um codigo numerico token para os smbolos lexicos encontrados. A codificacao numerica simplifica a comparacao dos smbolos nas outras fases da compilacao.
4. Excluir os espacos em branco e os comentarios do programa fonte.
5. Detectar erros lexicos, i. e., smbolos que nao fazem parte do vocabulario da linguagem:
caracteres invalidos: ex: a := 2#3
tamanhos dos identificadores, literais e constantes (overflow)
Exemplo: Para o Codigo 1.1 o resultado obtido pelo analisador lexico e apresentado
na Tabela 1.1.
Codigo Fonte 1.1: Programa Exemplo em Pascal
1
2
program exemplo ;
var
A , B : byte ;
CAPITULO 1. INTRODUC
AO
Item Token
Descric
ao
1
program
palavra reservada
2
exemplo
identificador
3
;
smbolo ponto e vrgula
4
var
palavra reservada
5
A
identificador
6
,
smbolo vrgula
7
B
identificador
8
:
smbolo dois pontos
9
byte
identificador
10
;
smbolo ponto e vrgula
11
begin
palavra reservada
12
A
identificador
13
:=
smbolo atribuicao
14
B
identificador
15
+
smbolo mais
16
0.5
n
umero
17
;
smbolo ponto e vrgula
18
end
palavra reservada
19
.
smbolo ponto final
Tabela 1.1: Resultado da analise lexica do Codigo 1.1
Nome Tipo
A
int
B
int
Endereco
0
1
begin
A := B + 0 . 5 ;
end .
Para o exemplo anterior, temos os tokens identificados por uma analisador lexico,
conforme a Tabela 1.1. Observe que um smbolo lexico pode ser simples como uma
vrgula (,) ou composto como uma palavra (program) ou uma sequencia de smbolos (:=).
1.3
Tabela de Smbolos
CAPITULO 1. INTRODUC
AO
1.4
An
alise Sint
atica
A analise sintatica e executada pelo parser e sua funcao principal e agrupar os tokens, retornados do analisar lexico, em estruturas sintaticas (comando, bloco, expressao,
identicador, n
umero, etc). Uma estrutura que pode ser empregada e a arvore sintatica.
A arvore representa a aplicacao das regras sintaticas da linguagem e definem, de certa
forma, um significado para a estrutura do programa compilado. O programa esta sintaticamente correto se for possvel construir uma u
nica arvore sintatica, no qual a raiz e o
smbolo inicial da gramatica da linguagem (smbolo de partida) e as folhas sao os tokens
retornados do analisado lexico.
A Figura 1.3 representa a arvore sintatica para a estrutura de repeticao do Codigo 1.2.
Codigo Fonte 1.2: Repeticao
1
2
1.5
An
alise Sem
antica
O analise semantica e a fase da compilacao em que e extrado o significado das es a partir dessa significacao e que e possvel a traducao (geracao) e
truturas sintaticas. E
otimizacao de codigo. Na analise semantica sao verificados tambem aspectos semanticos
do codigo com:
CAPITULO 1. INTRODUC
AO
1. Compatibilidade de tipos. Por exemplo, para algumas linguagens, o tipo da expressao no lado direito de uma atribuicao deve ser compatvel com o tipo da variavel
no lado esquerdo da atribuicao.
2. Verificacao do aspecto de visibilidade (escopo) de uma variavel. Por uma questao
logica, nao e permitido duas variaveis com o mesmo nome, no mesmo escopo do
codigo.
3. Compatibilidades entre declaracoes e uso de entidades. Por exemplo, nao faz sentido,
declarar um vetor e tentar usar como se fosse um registro.
4. Referencias nao resolvidas. Todo nome de entidade deve ter uma correspondencia
no codigo. Por exemplo, o nome de um rotulo de desvio deve marcar alguma posicao
no codigo.
1.6
Tratamento de erros
1.7
Gerac
ao de c
odigo intermedi
ario
Para simplificar o processo de traducao, pode-se empregar uma codificacao intermediaria. Por exemplo, para traducao de expressoes aritmeticas pode-se gerar tuplas.
Exemplo:
Codigo Fonte 1.3: Atribuicao
A :=
(B C) (D + E)
(+ , B , C , T1)
gera-se quadruplas: (- , D , E , T2)
(* , T1 , T2 , A)
1.8
Otimizac
ao geral
CAPITULO 1. INTRODUC
AO
1.9
i := 1 ;
repeat
J := X;
i := i + 1 ;
u n t i l i >= 1 0 0 ;
Otimizac
ao local
1.10
Gerac
ao de c
odigo objeto
Nessa fase e gerado o codigo objeto correspondente a cada estrutura sintatica identificada no programa.
Captulo 2
An
alise L
exica
O analisador lexico e a fase do compilador responsavel por fazer a leitura do texto
(programa fonte) caracter por caracter e traduzir os smbolos lexicos em tokens.
Os smbolos lexicos sao as palavras reservadas, os operadores, os identificadores, as
constantes literais, as constantes numericas, os comentarios, os espacos em branco e as tabulacoes. Os comentarios, os espacos em branco e as tabulacoes ajudam na documentacao
e identacao do codigo fonte, mas sao excludos do programa, pelo analisador lexico, para
as outras fases da compilacao.
Os identificadores reconhecidos nessa fase da compilacao devem ser cadastrados e
consultados da tabela de smbolos. Essa verificacao e cadastramento e realizado a partir
do reconhecimento desses smbolos lexicos.
Os tokens do analisador lexico sao utilizados com entrada para a fase da analise
sintatica, quando entao esses tokens sao agrupados em estruturas sintaticas, seguindo
as regras de producao da gramatica da linguagem de programacao.
Para a fase de analise lexica, especificamos os tokens a serem reconhecidos usando uma
gramatica regular. Especificamente para as ferramentas que geram automaticamente os
analisadores lexicos, como a ferramenta flex, os tokens sao definidos atraves de expressoes
regulares. A partir dessas expressoes regulares a ferramenta gera o automato finito para
o seu reconhecimento, na forma de uma programa de reconhecimento.
Um processo similar e empregado para construcao do analisador sintatico, que veremos
no proximo captulo. A sintaxe da linguagem de programacao e especificada, para as
ferramentas que geram automaticamente analisadores sintaticos, atraves de gramaticas
livres de contexto (GLC). O utilitario bison, traduz GLC no automato de pilha que e o
analisador sintatico da linguagem.
Na proxima secao serao revistos alguns conceitos relacionados a gramaticas, linguagens, automatos apresentados na disciplina de Linguagens Formais e Automatos e que
serao utilizados nas fases de analise lexica e sintatica do projeto do compilador.
2.1
Revis
ao de Alfabeto, Gram
atica e Linguagem
2.1.1
O alfabeto e um conjunto finito e nao vazio de smbolos que podem ser simples como
dgitos, letras e caracteres especiais, ou entao compostos, como begin, :=, que serao
tratados, em geral, como smbolos indivisveis (tokens). Seja um alfabeto. Uma cadeia
(ou uma frase) sobre e ma sequencia finita de smbolos de . e o conjunto de todas
as cadeias sobre .
10
CAPITULO 2. ANALISE
LEXICA
2.1.2
11
Linguagens
2.1.3
Gram
atica
A gramatica pode ser definida de maneira formal como uma quadrupla G = (V, , R, P ),
onde V e vocabulario de smbolos nao-terminais de G, tambem chamados de variaveis da
gramatica. e o vocabulario de smbolos terminais de G, disjunto de V . R sao as regras
de producao ou regras de sintaxe. P e um smbolo de V (raiz, smbolo inicial ou smbolo
de partida da gramatica G).
2.1.4
Gram
atica Regular
A gramatica regular e uma gramatica, em que cada regra tem uma das formas: X a
ou X aY ou X , onde X e Y sao smbolos nao-terminais e a e um smbolo terminal.
Gramaticas Regulares, Expressoes Regulares e Automatos finitos sao tres formalismos
alternativos usados para especificar linguagens regulares. Usamos essas especificacoes
para definir os padroes lexicos que sao reconhecidos pelo analisador lexico. Usaremos a
ferramenta flex para traduzir as especificacoes em expressoes regulares, no automato finito
que e o analisador lexico.
2.1.5
Gram
atica Livre de Contexto
E
R=
O
I := E|C; C
I|EOE|(E)
+|
a|b
CAPITULO 2. ANALISE
LEXICA
12
2.1.6
Deriva
c
ao
2.1.7
Arvores
de Derivac
ao
2.1.8
Gram
atica Ambgua
CAPITULO 2. ANALISE
LEXICA
13
b then C
else C
| if
b then
Esta gramatica e ambgua, pois temos duas arvores de derivacao para a sentenca
if b then if b then a else a, conforme ilustrado na Figura 2.5.
Isto se deve ao fato da parte else a poder ser associada tanto com o primeiro como
com o segundo if. Ainda neste caso podemos eliminar a ambiguidade:
C a | if
D a | if
b then D
b then D
else C | if
else D
b then C
Note-se que esta gramatica sempre associa o else com o if mais proximo possvel.
CAPITULO 2. ANALISE
LEXICA
14
CAPITULO 2. ANALISE
LEXICA
2.1.9
15
Exerccios
| bS
| c.
2.2
A primeira fase do compilador deve ler o arquivo fonte e converter sequencia de caracteres em tokens. A construcao dessa rotina nao e tao complicada de se implementar,
no entanto, existem ferramentas que podem ser utilizadas para automatizar essa fase da
traducao. Lex e uma ferramenta usada para geracao de analisadores lexicos. Especifica-se
padroes lexicos para lex usando expressoes regulares. E para cada smbolo encontrado
associa-se uma acao que pode ser, por exemplo, retornar a codificacao numerica (token)
do smbolo encontrado. A seguinte expressao regular pode ser usada para pesquisar por
identificadores (nomes escolhidos pelo programados):
letra(letra|digito)
Onde:
letra representa qualquer letra do alfabeto
digito representa qualquer dgito.
a barra vertical (|), significa alternativa.
o asterisco (), significa repeticao (zero ou mais vezes a expressao precedente).
os smbolos em sequencia representam concatenacao.
Toda expressao regular pode ser expressa como um automato de estados finitos (finite state automaton -FSA). Um automato de estados finitos e composto de estados e
transicoes entre estados. Existe um estado denominado estado inicial e um ou mais estados finais ou estados de aceitacao.
CAPITULO 2. ANALISE
LEXICA
16
inicio :
goto e s t a d o 0
2
3
4
5
e s t a d o 0 : read c
i f c = l e t r a goto e s t a d o 1
goto e s t a d o 0
6
7
8
9
10
e s t a d o 1 : read
if c
if c
goto
c
= l e t r a goto e s t a d o 1
= d i g i t o goto e s t a d o 1
estado2
11
12
estado2 : accept i d e n t i f i c a d o r
A ferramenta lex funciona basicamente dessa forma, traduzindo as expressoes regulares num codigo em linguagem C que programa um automato de estados finitos para
reconhecimento dos smbolos lexicos. O proximo estado e determinado pela indexacao
numa tabela de estados gerada pelo computador usando o proximo caracter de entrada e
o estado corrente.
Lex tem algumas limitacoes. Por exemplo, lex nao pode ser usado para reconhecer
estruturas aninhadas tal como parenteses. Estruturas aninhadas sao manipuladas com
auxlio de pilhas. Quando encontramos um ( nos empilhamos este caracter. Quando
encontramos um ) nos comparamos como o topo da pilha e desempilhamos um smbolo.
Lex, entretanto so tem estados e transicoes entre estados. Como nao tem pilha, nao e
indicada para analisar estruturas aninhadas. A ferramenta Yacc/Bison uma pilha ao
automato finito e podem, dessa forma, processar as estruturas aninhadas, caractersticas
das linguagens de programacao.
2.2.1
Metacaracteres Lex
Alguns carateres tem um significado especial nas expressoes regulares escritas para
Lex. Os principais sao apresentados na Tabela 2.1.
Alguns exemplos de correspondencias entre expressoes regulares para Lex e os smbolos
que sao reconhecidos estao representados na Tabela 2.2.
CAPITULO 2. ANALISE
LEXICA
Metacaracter
x
.
\n
*
+
?
$
a |b
(ab)+
a+b
[abc]
Correspond
encia
caracter x, exceto nova linha
Qualquer caracter exceto nova linha
Nova linha
Zero ou mais copias da expressao precedente
Uma ou mais copias da expressao precedente
Zero ou uma copia da expressao precedente
Incio da linha
Fim da linha
Alternativa a ou b
Uma ou mais copias de ab (agrupamento)
Literal a+b
Classe de caracteres. Nesse caso, a, b ou c.
17
CAPITULO 2. ANALISE
LEXICA
18
. . . definicoes . . .
%%
. . . regras . . .
%%
. . . subrotinas . . .
%%
%%
2
3
4
5
\n
/ match e v e r y t h i n g e x c e p t n e w l i n e /
ECHO;
/ match n e w l i n e /
ECHO;
6
7
%%
8
9
10
11
i n t yywrap ( v o i d ) {
return 1;
}
12
13
14
15
16
i n t main ( v o i d ) {
yylex ();
return 0;
}
Dois padroes foram especificados na secao de regras. Cada padrao tem que comecar
na primeira coluna do arquivo texto. Estes sao seguidos por caracter em branco (espaco,
tabulacao ou nova linha) e uma acao opcional associada com o padrao. A acao pode ser um
u
nico comando C ou m
ultiplos comandos delimitados por chaves. Qualquer comando que
nao comeca na primeira coluna e copiado como esta para o arquivo C gerado. Podemos
usar comentarios no arquivo lex. Neste exemplo ha dois padroes . e \n, com a acao
ECHO associada com cada padrao. Varias macros e variaveis sao pre-definidas por lex.
ECHO e uma macro que escreve o codigo reconhecido pelo padrao lexico. Esta e a acao
default para qualquer string nao reconhecido. Normalmente, ECHO e definido como:
1
CAPITULO 2. ANALISE
LEXICA
Nome
int yylex(void)
char *yytext
yyleng
yylval
int yywrap(void)
FILE *yyout
FILE *yyin
INITIAL
BEGIN condition
ECHO
19
Func
ao
Funcao principal do analisador que retorna o proximo token.
Ponteiro para o padrao lexico (string) reconhecido.
Tamanho do string reconhecido.
Valor associado com o token.
wrapup, retorna 1 se acabou, 0 se nao acabou.
Arquivo de sada.
Arquivo de entrada.
Condicao inicial.
Troca a condicao inicial.
Escreve o string reconhecido.
2.2.2
%%
.
\n
%{
int yylineno ;
%}
%%
(.)\n
p r i n t f (%4d\ t%s , ++y y l i n e n o , y y t e x t ) ;
%%
i n t main ( i n t argc , char argv [ ] ) {
yyin = fopen ( argv [ 1 ] , r ) ;
yylex ();
f c l o s e ( yyin ) ;
}
3
4
5
6
7
8
9
10
11
CAPITULO 2. ANALISE
LEXICA
20
digit
[0 9]
letter
[ AZaz ]
%{
i n t co u nt ;
%}
%%
/ match i d e n t i f i e r /
{ l e t t e r } ( { l e t t e r } | { d i g i t } )
count++;
%%
i n t main ( v o i d ) {
yylex ();
p r i n t f ( number o f i d e n t i f i e r s = %d\n , c o un t ) ;
return 0;
}
%{
i n t nchar , nword , n l i n e ;
%}
%%
\n
{ n l i n e ++; nchar++; }
[ \ t \n]+ { nword++, nchar += y y l e n g ; }
.
{ nchar++; }
%%
i n t main ( v o i d ) {
yylex ();
p r i n t f (%d\ t%d\ t%d\n , nchar , nword , n l i n e ) ;
return 0;
}
3
4
5
6
7
8
9
10
11
12
13
2.3
Analisador L
exico para Linguagem Simples
A linguagem Simplesr , na sua versao inicial, e composta dos seguintes smbolos lexicos:
Palavras Reservadas: programa, inicio, fimprograma, leia, escreva, se, entao,
senao, fimse, enquanto, faca, fimenquanto.
Operadores: +, -, *, div, >, <, +, e, ou, nao, <, (, )
tipos: inteiro, logico
constantes: V, F
identificadores: (letra)(letra|digito)*
n
umeros: (digito)+
CAPITULO 2. ANALISE
LEXICA
21
programa t e s t e
inteiro A B
inicio
A < 5
leia B
B < A B
escreva B
fimprograma
programa :
teste :
inteiro :
A:
B:
inicio :
A:
<:
5:
leia :
B:
B:
<:
A:
:
B:
escreva :
B:
fimprograma :
palavra reservada
identificador
palavra reservada
identificador
identificador
palavra reservada
identificador
o p e r a d o r de a t r i b u i c a o
numero
palavra reservada
identificador
identificador
o p e r a d o r de a t r i b u i c a o
identificador
operador a r i t m e t i c o m u l t i p l i c a c a o
identificador
palavra reservada
identificador
palavra reservada
O arquivo de especificacao Lex que implementa esse classificador de smbolos da linguagem Simples e:
1
2
3
4
identificador
numero
espaco
novalinha
5
6
%%
7
8
9
10
programa
inicio
fimprograma
p r i n t f ( %11s : p a l a v r a r e s e r v a d a \n , y y t e x t ) ;
p r i n t f ( %11s : p a l a v r a r e s e r v a d a \n , y y t e x t ) ;
p r i n t f ( %11s : p a l a v r a r e s e r v a d a \n , y y t e x t ) ;
leia
escreva
p r i n t f ( %11s : p a l a v r a r e s e r v a d a \n , y y t e x t ) ;
p r i n t f ( %11s : p a l a v r a r e s e r v a d a \n , y y t e x t ) ;
se
entao
senao
fimse
p r i n t f ( %11s :
p r i n t f ( %11s :
p r i n t f ( %11s :
p r i n t f ( %11s :
enquanto
p r i n t f ( %11s : p a l a v r a r e s e r v a d a \n , y y t e x t ) ;
11
12
13
14
15
16
17
18
palavra
palavra
palavra
palavra
r e s e r v a d a \n ,
r e s e r v a d a \n ,
r e s e r v a d a \n ,
r e s e r v a d a \n ,
yytext ) ;
yytext ) ;
yytext ) ;
yytext ) ;
19
20
CAPITULO 2. ANALISE
LEXICA
22
faca
fimenquanto
p r i n t f ( %11s : p a l a v r a r e s e r v a d a \n , y y t e x t ) ;
p r i n t f ( %11s : p a l a v r a r e s e r v a d a \n , y y t e x t ) ;
26
p r i n t f ( %11s : o p e r a d o r a r i t m e t i c o soma\n , y y t e x t ) ;
p r i n t f ( %11s : o p e r a d o r a r i t m e t i c o s u b t r a c a o \n , y y t e x t ) ;
p r i n t f ( %11s : o p e r a d o r a r i t m e t i c o m u l t i p l i c a c a o \n , y y t e x t )
27
div
p r i n t f ( %11s : o p e r a d o r a r i t m e t i c o d i v i s a o \n , y y t e x t ) ;
>
<
=
p r i n t f ( %11s : o p e r a d o r r e l a c i o n a l maior \n , y y t e x t ) ;
p r i n t f ( %11s : o p e r a d o r r e l a c i o n a l menor\n , y y t e x t ) ;
p r i n t f ( %11s : o p e r a d o r r e l a c i o n a l i g u a l \n , y y t e x t ) ;
e
ou
nao
p r i n t f ( %11s : o p e r a d o r l o g i c o c o n j u n c a o \n , y y t e x t ) ;
p r i n t f ( %11s : o p e r a d o r l o g i c o d i s j u n c a o \n , y y t e x t ) ;
p r i n t f ( %11s : o p e r a d o r l o g i c o negacao \n , y y t e x t ) ;
<
(
)
p r i n t f ( %11s : o p e r a d o r de a t r i b u i c a o \n , y y t e x t ) ;
p r i n t f ( %11s : s i m b o l o a b r e p a r e n t e s e s \n , y y t e x t ) ;
p r i n t f ( %11s : s i m b o l o f e c h a p a r e n t e s e s \n , y y t e x t ) ;
inteiro
logico
V
F
p r i n t f ( %11s :
p r i n t f ( %11s :
p r i n t f ( %11s :
p r i n t f ( %11s :
{ identificador }
{numero}
{ espaco }
{ novalinha }
.
p r i n t f ( %11s : i d e n t i f i c a d o r \n , y y t e x t ) ;
p r i n t f ( %11s : numero\n , y y t e x t ) ;
/ nao f a z nada /
/ nao f a z nada /
p r i n t f ( %11s : ERRO SIMBOLO NAO RECONHECIDO! \ n , y y t e x t ) ;
21
22
23
24
25
;
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
p a l a v r a r e s e r v a d a \n , y y t e x t ) ;
p a l a v r a r e s e r v a d a \n , y y t e x t ) ;
c o n s t a n t e l o g i c a de verdade \n , y y t e x t ) ;
c o n s t a n t e l o g i c a de f a l s i d a d e \n , y y t e x t ) ;
45
46
47
48
49
50
51
52
%%
53
54
55
56
57
58
59
CAPITULO 2. ANALISE
LEXICA
23
CAPITULO 2. ANALISE
LEXICA
24
arquivo fonte e:
1
%{
int nLinha = 1 ;
2
3
%}
4
5
6
7
8
identificador
numero
espaco
novalinha
9
10
%x c o m e n t a r i o
11
12
%%
13
14
15
16
programa
yytext ) ;
inicio
yytext ) ;
fimprograma
yytext ) ;
p r i n t f ( Linha=%2d>%12s : p a l a v r a r e s e r v a d a \n , nLinha ,
leia
yytext ) ;
escreva
yytext ) ;
p r i n t f ( Linha=%2d>%12s : p a l a v r a r e s e r v a d a \n , nLinha ,
p r i n t f ( Linha=%2d>%12s : p a l a v r a r e s e r v a d a \n , nLinha ,
p r i n t f ( Linha=%2d>%12s : p a l a v r a r e s e r v a d a \n , nLinha ,
17
18
19
p r i n t f ( Linha=%2d>%12s : p a l a v r a r e s e r v a d a \n , nLinha ,
20
21
22
23
24
p r i n t f ( Linha=%2d>%12s : p a l a v r a r e s e r v a d a \n , nLinha ,
se
yytext ) ;
entao
yytext ) ;
senao
yytext ) ;
fimse
yytext ) ;
p r i n t f ( Linha=%2d>%12s : p a l a v r a r e s e r v a d a \n , nLinha ,
p r i n t f ( Linha=%2d>%12s : p a l a v r a r e s e r v a d a \n , nLinha ,
p r i n t f ( Linha=%2d>%12s : p a l a v r a r e s e r v a d a \n , nLinha ,
25
26
27
28
enquanto
yytext ) ;
faca
yytext ) ;
fimenquanto
yytext ) ;
p r i n t f ( Linha=%2d>%12s : p a l a v r a r e s e r v a d a \n , nLinha ,
p r i n t f ( Linha=%2d>%12s : p a l a v r a r e s e r v a d a \n , nLinha ,
p r i n t f ( Linha=%2d>%12s : p a l a v r a r e s e r v a d a \n , nLinha ,
29
30
, yytext ) ;
31
32
33
p r i n t f ( Linha=%2d>%12s : o p e r a d o r a r i t m e t i c o s u b t r a c a o \n ,
nLinha , y y t e x t ) ;
p r i n t f ( Linha=%2d>%12s : o p e r a d o r a r i t m e t i c o m u l t i p l i c a c a o \n
, nLinha , y y t e x t ) ;
div
p r i n t f ( Linha=%2d>%12s : o p e r a d o r a r i t m e t i c o d i v i s a o \n ,
nLinha , y y t e x t ) ;
34
35
36
37
38
p r i n t f ( Linha=%2d>%12s : o p e r a d o r r e l a c i o n a l maior \n ,
nLinha , y y t e x t ) ;
<
p r i n t f ( Linha=%2d>%12s : o p e r a d o r r e l a c i o n a l menor\n ,
nLinha , y y t e x t ) ;
=
p r i n t f ( Linha=%2d>%12s : o p e r a d o r r e l a c i o n a l i g u a l \n ,
nLinha , y y t e x t ) ;
>
CAPITULO 2. ANALISE
LEXICA
39
40
41
25
p r i n t f ( Linha=%2d>%12s : o p e r a d o r l o g i c o c o n j u n c a o \n ,
nLinha , y y t e x t ) ;
ou
p r i n t f ( Linha=%2d>%12s : o p e r a d o r l o g i c o d i s j u n c a o \n ,
nLinha , y y t e x t ) ;
nao
p r i n t f ( Linha=%2d>%12s : o p e r a d o r l o g i c o negacao \n , nLinha ,
yytext ) ;
e
42
43
44
45
<
yytext ) ;
(
yytext ) ;
)
, yytext ) ;
p r i n t f ( Linha=%2d>%12s : o p e r a d o r de a t r i b u i c a o \n , nLinha ,
p r i n t f ( Linha=%2d>%12s : s i m b o l o a b r e p a r e n t e s e s \n , nLinha ,
p r i n t f ( Linha=%2d>%12s : s i m b o l o f e c h a p a r e n t e s e s \n , nLinha
46
47
48
49
50
inteiro
p r i n t f ( Linha=%2d>%12s :
yytext ) ;
logico
p r i n t f ( Linha=%2d>%12s :
yytext ) ;
V
p r i n t f ( Linha=%2d>%12s :
nLinha , y y t e x t ) ;
F
p r i n t f ( Linha=%2d>%12s :
nLinha , y y t e x t ) ;
p a l a v r a r e s e r v a d a \n , nLinha ,
p a l a v r a r e s e r v a d a \n , nLinha ,
c o n s t a n t e l o g i c a de verdade \n ,
c o n s t a n t e l o g i c a de f a l s i d a d e \n ,
51
52
53
54
55
{ identificador }
{numero}
{ espaco }
{ novalinha }
p r i n t f ( Linha=%2d>%12s : i d e n t i f i c a d o r \n , nLinha , y y t e x t ) ;
p r i n t f ( Linha=%2d>%12s : numero\n , nLinha , y y t e x t ) ;
/ nao f a z nada /
nLinha++;
// .
/ nao f a z nada /
56
57
58
59
60
61
62
63
/
BEGIN ( c o m e n t a r i o ) ;
<comentario >[\n ]
/ nao f a z nada /
<comentario > [ ] + [ / \ n ]
/ nao f a z nada /
<comentario >\n
nLinha++;
<comentario > + /
BEGIN ( INITIAL ) ;
64
65
66
67
%%
68
69
70
71
72
73
74
programa t e s t e
i n t e i r o A B // e s t e eh um c o m e n t a r i o de l i n h a
inicio
/ v a r i a v e l A
r e c e b e o v a l o r 5 /
A < 5
leia B
B < A B
escreva B
CAPITULO 2. ANALISE
LEXICA
10
26
fimprograma
Linha= 1>
programa :
Linha= 1>
teste :
Linha= 2>
inteiro :
Linha= 2>
A:
Linha= 2>
B:
Linha= 3>
inicio :
Linha= 6>
A:
Linha= 6>
<:
Linha= 6>
5:
Linha= 7>
leia :
Linha= 7>
B:
Linha= 8>
B:
Linha= 8>
<:
Linha= 8>
A:
Linha= 8>
:
Linha= 8>
B:
Linha= 9>
escreva :
Linha= 9>
B:
Linha=10> fimprograma :
palavra reservada
identificador
palavra reservada
identificador
identificador
palavra reservada
identificador
o p e r a d o r de a t r i b u i c a o
numero
palavra reservada
identificador
identificador
o p e r a d o r de a t r i b u i c a o
identificador
operador a r i t m e t i c o m u l t i p l i c a c a o
identificador
palavra reservada
identificador
palavra reservada
Captulo 3
An
alise Sint
atica
O objetivo principal da analise sintatica e decidir se uma cadeia pertence ou nao `a
linguagem definida por uma gramatica. Existem duas importantes estrategias para o
problema de analise sintatica:
Analise Sintatica Ascendente
Analise Sintatica Descendente
Na primeira, a arvore sintatica e construda partindo-se da cadeia a ser analisada,
subindo-se ate atingir o smbolo inicial da gramatica. Na segunda, parte-se do smbolo
inicial e vai-se descendo ate atingir todos os smbolos da cadeia que esta sendo analisada.
Apresentamos nesse captulo um estrategia (existem outras) para analise descendente
e uma estrategia para analise ascendente.
3.1
An
alise LL
27
CAPITULO 3. ANALISE
SINTATICA
3.1.1
28
Fun
c
ao F IRST
3.1.2
Fun
c
ao F OLLOW
E TE
0
0
E +T E |
0
T FT
0
0
T F T |
F a|(E)
Conjuntos FIRST e FOLLOW:
E
0
E
T
0
T
F
FIRST FOLLOW
{(, a}
{), #}
{+, }
{), #}
{(, a}
{+, ), #}
{, }
{+, ), #}
{(, a} {, +, ), #}
CAPITULO 3. ANALISE
SINTATICA
29
E
0
E
T
0
T
F
E +T E
T FT
(
0
E TE
T FT
0
F a
#
0
E E
T F T
F (E)
3.2
An
alise LR
REDUC
AO).
3. O passo 2 e repetido ate que o valor de seja reduzido para o smbolo inicial da
gramatica.
Na descricao generica do algoritmo de analise ascendente usa-se a intuicao para decidir que regra de producao utilizar para reducao. Em algumas situacoes temos mais de
uma reducao possvel. Para automatizar o processo de analise sintatica existem alguns
algoritmos que utilizam uma tabela (matriz) representando a gramatica para decidir de
forma automatica as reducoes. A ideia basica deste metodo e que para cada smbolo da
cadeia de entrada e feita uma consulta na tabela. O valor obtido da tabela (um estado) e
empilhado. Em cada passo, o u
ltimo estado empilhado e utilizado para decidir sobre uma
CAPITULO 3. ANALISE
SINTATICA
30
eventual reducao. O processo continua ate que seja encontrada uma situacao de erro, ou
entao, ate que a cadeia de entrada seja reconhecida.
A tabela de analise e uma matriz retangular cujas linhas sao indexadas pelos estados,
e as colunas pelos smbolos do vocabulario da gramatica (terminais e nao-terminais). Os
elementos da matriz indicam as acoes que podem ser tomadas pelo algoritmo que podem
ser:
Empilhar o estado ei
Reduzir usando a j-esima regra de producao.
Aceitar
Rejeitar
Consideremos a gramatica abaixo cujas producoes foram numeradas para fins de referencia:
(1)
(2)
(3)
(4)
E
E
E
E
+EE
EE
a
b
E
e1
+
e2
*
e3
a
e4
b
e5
e6
e7
e2
e2
r3
r4
e2
e2
r1
r2
e3
e3
r3
r4
e3
e3
r1
r2
e4
e4
r3
r4
e4
e4
r1
r2
e5
e5
r3
r4
e5
e5
r1
r2
#
a
e8
e9
r3
r4
r1
r2
CAPITULO 3. ANALISE
SINTATICA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
31
Inicio
P [ 0 ] eo
i 0
termino f a l s o
reduzido f a l s o
Simbolo PROXIMO ( )
R ep it a
Se r e d u z i d o
Entao s SimboloReduzido
Senao s Simbolo
Fims e
Caso Tabela [ P [ i ] , s ] de
Empilha ( ej ) :
i i + 1
P [ i ] ej
Se r e d u z i d o
Entao r e d u z i d o f a l s o
Senao Simbolo PROXIMO ( )
Re duz ir ( A ) :
i i | |
Reduzido v e r d a d e i r o
SimboloReduzido A
Aceitar : termino verdadeiro
R e j e i t a r : ERRO ( )
Fimc a s o
Ate t e r m i n o
Fim
CAPITULO 3. ANALISE
SINTATICA
32
A fim de tornar o processo de analise mais claro, os estados empilhados sao indicados
por si , onde s representa o smbolo que determinou a inclusao do estado na pilha e
i representa o estado propriamente dito.
Na reducao sao removidos k estados da pilha, onde k representa o n
umero de
smbolos no lado direito da regra de producao considerada.
Passo Pilha
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
eo
eo +2
eo +2 3
eo +2 3 a4
eo +2 3
eo +2 3 E7
eo +2 3 E7 +2
eo +2 3 E7 +2 b5
eo +2 3 E7 +2
eo +2 3 E7 +2 E6
eo +2 3 E7 +2 E6 a4
eo +2 3 E7 +2 E6
eo +2 3 E7 +2 E6 E8
eo +2 3 E7
eo +2 3 E7 E9
eo +2
eo +2 E6
eo +2 E6 a4
eo +2 E6
eo +2 E6 E8
eo
eo E1
Smbolo
Reduzido
E
E
E
E
E
Cadeia de
Ac
ao
Entrada
+*a+baa#
e2
*a+baa#
e3
a+baa#
e4
+baa#
r3
+baa#
e7
+baa#
e2
baa#
e5
aa#
r4
aa#
e6
aa#
e4
a#
r3
a#
e8
a#
r1
a#
e9
a#
r2
a#
e6
a#
e4
#
r3
#
e8
#
r1
#
e1
#
ACEITAR
3.2.1
Implementa
c
ao do Algoritmo LR
/++
| Implementacao do a l g o r i t m o de a n a l i s e s i n t a t i c a LR(K) .
|
| Por L u i z Eduardo da S i l v a
|
++/
CAPITULO 3. ANALISE
SINTATICA
5
6
7
33
8
9
10
11
12
/++
| V o c a b u l a r i o , Regras de Producao de uma g r a m a t i c a
|
| e a Tabela de A n a l i s e LR( k ) para a e s t a g r a m a t i c a .
|
++/
13
14
15
16
17
18
19
20
21
22
#define NSIMBOLOS 7
#define NREGRAS
4
#define NESTADOS 9
char a l f a b e t o [NSIMBOLOS+1] = SLa [ ] ; # ;
char r e g r a s [NREGRAS] =
{ S : : = a ,
S : : = [ L ] ,
L : : = S ,
L : : = L ; S } ;
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
struct {
char acao ;
int i n d i c e ;
} TabSint [NESTADOS ] [ NSIMBOLOS] =
{ e ,1 , ,0 , e ,2 , e ,3 ,
,0 , ,0 , ,0 , ,0 ,
,0 , ,0 , r ,1 , r ,1 ,
e ,4 , e ,5 , e ,2 , e ,3 ,
,0 , ,0 , r ,3 , r ,3 ,
,0 , ,0 , ,0 , ,0 ,
,0 , ,0 , r ,2 , r ,2 ,
e ,8 , ,0 , e ,2 , e ,3 ,
,0 , ,0 , r ,4 , r ,4 ,
};
r
r
e
r
r
,0 ,
,0 ,
,1 ,
,0 ,
,3 ,
,6 ,
,2 ,
,0 ,
,4 ,
r
r
e
r
r
,0 ,
,0 ,
,1 ,
,0 ,
,3 ,
,7 ,
,2 ,
,0 ,
,4 ,
38
39
40
41
42
43
44
45
46
47
48
/
#d e f i n e NSIMBOLOS 6
#d e f i n e NREGRAS
4
#d e f i n e NESTADOS 10
cha r a l f a b e t o [NSIMBOLOS+1] = E+ab #;
cha r r e g r a s [NREGRAS] =
{ E::=+EE ,
E: : = EE ,
E: : = a ,
E: : = b } ;
49
50
51
52
53
54
55
56
57
58
59
60
61
62
struct {
ch ar acao ;
int indice ;
} TabSint [NESTADOS ] [ NSIMBOLOS] =
{ e ,1 , e ,2 , e ,3 , e ,4 ,
,0 , ,0 , ,0 , ,0 ,
e ,6 , e ,2 , e ,3 , e ,4 ,
e ,7 , e ,2 , e ,3 , e ,4 ,
,0 , r ,3 , r ,3 , r ,3 ,
,0 , r ,4 , r ,4 , r ,4 ,
e ,8 , e ,2 , e ,3 , e ,4 ,
e ,9 , e ,2 , e ,3 , e ,4 ,
,0 , r ,1 , r ,1 , r ,1 ,
e
e
r
r
e
e
r
,5 ,
,0 ,
,5 ,
,5 ,
,3 ,
,4 ,
,5 ,
,5 ,
,1 ,
,0 ,
a ,0 ,
,0 ,
,0 ,
r ,3 ,
r ,4 ,
,0 ,
,0 ,
r ,1 ,
a
r
r
r
r
,0 ,
,0 ,
,1 ,
,0 ,
,3 ,
,0 ,
,2 ,
,0 ,
,4 ,
CAPITULO 3. ANALISE
SINTATICA
,0 , r ,2 , r ,2 , r ,2 , r ,2 , r ,2
63
64
34
};
65
66
67
68
69
70
71
72
#d e f i n e NSIMBOLOS 5
#d e f i n e NREGRAS
2
#d e f i n e NESTADOS 6
cha r a l f a b e t o [NSIMBOLOS+1] = Sacb #;
cha r r e g r a s [NREGRAS] =
{ S : : = aSc ,
S : : = b } ;
73
74
75
76
77
78
79
80
81
82
83
84
struct {
cha r acao ;
int indice ;
} TabSint [NESTADOS ] [ NSIMBOLOS] =
{ e ,1 , e ,2 , ,0 , e ,3 ,
,0 , ,0 , ,0 , ,0 ,
e ,4 , e ,2 , ,0 , e ,3 ,
,0 , r ,2 , r ,2 , r ,2 ,
,0 , ,0 , e ,5 , ,0 ,
,0 , r ,1 , r ,1 , r ,1 ,
};
,0 ,
a ,0 ,
,0 ,
r ,2 ,
,0 ,
r ,1 ,
85
86
87
88
89
90
91
92
93
94
#d e f i n e NSIMBOLOS 7
#d e f i n e NREGRAS
4
#d e f i n e NESTADOS 9
cha r a l f a b e t o [NSIMBOLOS+1] = SL ( ) , a#;
cha r r e g r a s [NREGRAS] =
{ S : : = ( L) ,
S : : = a ,
L: : =L , S ,
L: : = S } ;
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
struct {
ch ar acao ;
int indice ;
} TabSint [NESTADOS ] [ NSIMBOLOS] =
{ e ,1 , ,0 , e ,2 , ,0 ,
,0 , ,0 , ,0 , ,0 ,
e ,4 , e ,5 , e ,2 , ,0 ,
,0 , ,0 , r ,2 , r ,2 ,
,0 , ,0 , r ,4 , r ,4 ,
,0 , ,0 , ,0 , e ,6 ,
,0 , ,0 , r ,1 , r ,1 ,
e ,8 , ,0 , e ,2 , ,0 ,
,0 , ,0 , r ,3 , r ,3 ,
};
r
r
e
r
,0 ,
,0 ,
,0 ,
,2 ,
,4 ,
,7 ,
,1 ,
,0 ,
,3 ,
110
111
112
113
114
115
116
117
118
119
120
#d e f i n e NSIMBOLOS 7
#d e f i n e NREGRAS
4
#d e f i n e NESTADOS 9
cha r a l f a b e t o [NSIMBOLOS+1] = SLa [ ] ; # ;
cha r r e g r a s [NREGRAS] =
{ S : : = a ,
S : : = [ L ] ,
L: : = S ,
L: : =L ; S } ;
e
r
r
r
e
r
,3 ,
,0 ,
,3 ,
,2 ,
,4 ,
,0 ,
,1 ,
,3 ,
,3 ,
,0 ,
a ,0 ,
,0 ,
r ,2 ,
r ,4 ,
,0 ,
r ,1 ,
,0 ,
r ,3 ,
CAPITULO 3. ANALISE
SINTATICA
35
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
struct {
cha r acao ;
int indice ;
} TabSint [NESTADOS ] [ NSIMBOLOS] =
{ e ,1 , ,0 , e ,2 , e ,3 ,
,0 , ,0 , ,0 , ,0 ,
,0 , ,0 , r ,1 , r ,1 ,
e ,4 , e ,5 , e ,2 , e ,3 ,
,0 , ,0 , r ,3 , r ,3 ,
,0 , ,0 , ,0 , ,0 ,
,0 , ,0 , r ,2 , r ,2 ,
e ,8 , ,0 , e ,2 , e ,3 ,
,0 , ,0 , r ,4 , r ,4 ,
};
/
r
e
r
,0 ,
,0 ,
,1 ,
,0 ,
,3 ,
,6 ,
,2 ,
,0 ,
,4 ,
r
e
r
,0 ,
,0 ,
,1 ,
,0 ,
,3 ,
,7 ,
,2 ,
,0 ,
,4 ,
,0 ,
a ,0 ,
r ,1 ,
,0 ,
r ,3 ,
,0 ,
r ,2 ,
,0 ,
r ,4 ,
137
138
139
140
141
142
143
144
/++
| P i l h a s i n t a t i c a u t i l i z a d a p e l o a l g o r i t m o de a n a l i s e LR(K) .
|
++/
struct {
char elem ;
int i n d ;
} P[20];
145
146
147
void t r a c o ( int ) ;
void s t r i n s ( char , int , char , int ) ;
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/++
| Programa p r i n c i p a l que implementa o a l g o r i t m o de a n a l i s e LR(K) .
|
| E s t e programa LE uma s e n t e n c a e v e r i f i c a s e e s t a s e n t e n c a eh
|
| v a l i d a ou para a g r a m a t i c a r e p r e s e n t a d a na t a b e l a de a n a l i s e .
|
| Durante o p r o c e s s o de a n a l i s e o programa a p r e s e n t a , de forma
|
| t a b u l a r , os v a l o r e s das e s t r u t u r a s a cada p a s s o .
|
++/
int main ( )
{
int i , j , k , termino , r e d u z i d o , i n d i c e , ind , tam , passo ,
nreducao , i n d r e d u z = 1, r e d u c o e s [ 5 0 ] ;
char s e n t e n c a [ 4 0 ] , p i l h a [ 6 0 ] , c a d e i a [ 4 0 ] , s t r [ 4 0 ] ;
char s , s i m b o l o r e d u z i d o = , acao ;
162
163
164
165
P [ 0 ] . elem = e ;
P [ 0 ] . ind = 0 ;
i = termino = reduzido = 0 ;
166
167
168
p r i n t f ( \ nDigite a sentenca : ) ;
gets ( sentenca ) ;
169
170
171
172
173
174
175
176
177
178
s t r c a t ( s e n t e n c a , # ) ;
indice = 0;
passo = 0;
p r i n t f ( PASSO %30s S .R. %15s
traco (79) ;
while ( ! t e r m i n o ) {
i f ( reduzido )
s = simboloreduzido ;
else
CAPITULO 3. ANALISE
SINTATICA
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
36
s = sentenca [ indice ] ;
f o r ( j =0; a l f a b e t o [ j ] != s && j <= s t r l e n ( a l f a b e t o ) ; j ++) ;
i f ( a l f a b e t o [ j ] != s ) {
p r i n t f ( \nERRO: o s i m b o l o <%c> nao e r e c o n h e c i d o n e s t a linguagem ,
s);
p r i n t f ( \n\ n D i g i t e . para t e r m i n a r ! ) ;
while ( g e t c h a r ( ) != . ) ;
exit (10) ;
}
acao = TabSint [ P [ i ] . i n d ] [ j ] . acao ;
i n d = TabSint [ P [ i ] . i n d ] [ j ] . i n d i c e ;
f o r ( j = 0 , k = i n d i c e ; s e n t e n c a [ k ] ; j ++, k++)
cadeia [ j ] = sentenca [ k ] ;
c a d e i a [ j ] = \0 ;
strcpy ( pilha , ) ;
f o r ( k = 0 ; k <= i ; k++) {
s p r i n t f ( s t r , %c%d , P [ k ] . elem , P [ k ] . i n d ) ;
s t r c a t ( pilha , s t r ) ;
}
%30s %c
%15s %c%d\n ,
p r i n t f ( %3d
p a s s o ++, p i l h a , s i m b o l o r e d u z i d o , c a d e i a , acao , i n d ) ;
switch ( acao ) {
case e :
i ++;
P [ i ] . elem = s ;
P[ i ] . ind = ind ;
i f ( reduzido ) {
reduzido = 0;
simboloreduzido = ;
}
else
i n d i c e ++;
break ;
case r : tam = s t r l e n ( r e g r a s [ ind 1]) ;
i = i tam + 4 ;
reduzido = 1;
r e d u c o e s [++ i n d r e d u z ] = ind 1;
s i m b o l o r e d u z i d o = r e g r a s [ ind 1 ] [ 0 ] ;
break ;
case a : t e r m i n o = 1 ;
p r i n t f ( \nA s e n t e n c a <%s> e s t a c o r r e t a , s e n t e n c a ) ;
break ;
case :
p r i n t f ( \nA s e n t e n c a <%s> NAO e r e c o n h e c i d a , s e n t e n c a ) ;
p r i n t f ( \n\ n D i g i t e . para t e r m i n a r ! ) ;
while ( g e t c h a r ( ) != . ) ;
exit (1) ;
}
/ g e t c h a r ( ) ; /
}
/ Mostra a s e r i e de d e r i v a c o e s mais a d i r e i t a para p r o d u z i r a s e n t e n c a
/
p r i n t f ( \n\ nGramatica : ) ;
p r i n t f ( \n==========\n ) ;
f o r ( i = 0 ; i < NREGRAS; i ++)
p r i n t f ( (%d ) . %s \n , i +1, r e g r a s [ i ] ) ;
p r i n t f ( \n\ n S e q u e n c i a de D e r i v a c o e s mais a d i r e i t a : ) ;
p r i n t f ( \n=======================================\n\n ) ;
sentenca [ 0 ] = regras [ 0 ] [ 0 ] ;
s e n t e n c a [ 1 ] = \0 ;
CAPITULO 3. ANALISE
SINTATICA
p r i n t f ( %s , s e n t e n c a ) ;
while ( i n d r e d u z >= 0 )
{
i = s t r l e n ( sentenca ) 1;
while ( s e n t e n c a [ i ] < A | | s e n t e n c a [ i ] > Z ) i ;
nreducao = r e d u c o e s [ i n d r e d u z ];
s t r i n s ( r e g r a s [ nreducao ] , 4 , s e n t e n c a , i ) ;
p r i n t f ( =%d=> %s , nreducao +1, s e n t e n c a ) ;
}
p r i n t f ( \n\ n D i g i t e . para t e r m i n a r ! ) ;
while ( g e t c h a r ( ) != . ) ;
235
236
237
238
239
240
241
242
243
244
245
246
37
247
248
249
250
251
252
253
254
255
256
/++
| Desenha uma l i n h a de h i f e n s na t e l a .
|
++/
void t r a c o ( int i ) {
int k ;
f o r ( k = 0 ; k < i ; k++)
p r i n t f ( ) ;
p r i n t f ( \n ) ;
}
257
258
259
260
261
262
263
264
265
266
267
268
269
270
/++
| I n s e r e s u b s t r i n g da pos1 a t e o f i n a l de s1 na pos . pos2 do s t r i n g s2 |
++/
void s t r i n s ( char s1 , int pos1 , char s2 , int pos2 ) {
int i , tam s1 , tam s2 ;
f o r ( tam s1 = 0 ; s 1 [ tam s1 ] ; tam s1++) ;
f o r ( tam s2 = 0 ; s 2 [ tam s2 ] ; tam s2++) ;
f o r ( i = tam s2 ; i >= pos2 ; i )
s 2 [ i+tam s1pos1 1] = s 2 [ i ] ;
f o r ( i = pos1 ; i < tam s1 ; i ++)
s 2 [ i+pos2pos1 ] = s 1 [ i ] ;
s 2 [ tam s1+tam s2pos1 ]= \0 ;
}
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PASSO PILHA
S .R. SENTENCA
ACAO
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
e0
e0 [ 3
e0 [ 3 a2
e0 [ 3
e0 [ 3 S4
e0 [ 3
e0 [ 3 L5
e0 [ 3 L5 ; 7
e0 [ 3 L5 ; 7 [ 3
e0 [ 3 L5 ; 7 [ 3 a2
e0 [ 3 L5 ; 7 [ 3
e0 [ 3 L5 ; 7 [ 3 S4
e0 [ 3 L5 ; 7 [ 3
e0 [ 3 L5 ; 7 [ 3 L5
e0 [ 3 L5 ; 7 [ 3 L5 ; 7
e0 [ 3 L5 ; 7 [ 3 L5 ; 7 a2
S
L
S
L
[ a ; [ a ; a ]]#
a ; [ a ; a ]]#
; [ a ; a ]]#
; [ a ; a ]]#
; [ a ; a ]]#
; [ a ; a ]]#
; [ a ; a ]]#
[ a ; a ]]#
a ; a ]]#
; a ]]#
; a ]]#
; a ]]#
; a ]]#
; a ]]#
a ]]#
]]#
e3
e2
r1
e4
r3
e5
e7
e3
e2
r1
e4
r3
e5
e7
e2
r1
CAPITULO 3. ANALISE
SINTATICA
19
20
21
22
23
24
25
26
27
28
29
30
16
17
18
19
20
21
22
23
24
25
26
27
e0 [ 3 L5 ; 7 [ 3 L5 ; 7
e0 [ 3 L5 ; 7 [ 3 L5 ; 7 S8
e0 [ 3 L5 ; 7 [ 3
e0 [ 3 L5 ; 7 [ 3 L5
e0 [ 3 L5 ; 7 [ 3 L5 ] 6
e0 [ 3 L5 ; 7
e0 [ 3 L5 ; 7 S8
e0 [ 3
e0 [ 3 L5
e0 [ 3 L5 ] 6
e0
e0S1
38
S
L
S
L
]]#
]]#
]]#
]]#
]#
]#
]#
]#
]#
#
#
#
e8
r4
e5
e6
r2
e8
r4
e5
e6
r2
e1
a0
31
32
A s e n t e n c a <[a ; [ a ; a]]#> e s t a c o r r e t a
33
34
35
36
37
38
39
Gramatica :
==========
(1) . S::= a
(2) . S ::=[L]
(3) . L::= S
(4) . L::=L ; S
40
41
42
43
S e q u e n c i a de D e r i v a c o e s mais a d i r e i t a :
=======================================
44
45
3.2.2
Constru
c
ao da Tabela de An
alise Sint
atica LR
Ja temos um metodo automatico para verificar a sintaxe em linguagens de programacao: o algoritmo de analise LR(k). Nesse algoritmo, todo trabalho do analisador
sintatico e orientado por uma tabela de analise que e construda a partir da gramatica LR
para linguagem. A questao e: como definir as acoes da tabela de analise LR(k). Antes
de apresentar o algoritmo para o calculo da colecao de estados (linhas da tabela) e para
definicao dos valores da tabela, precisamos fazer algumas definicoes.
Definicoes:
uma regra de producao na qual foi marcada uma posicao na cadeia do lado
1. Item: E
direito; esta posicao sera indicada por meio do smbolo (ponto). Exemplo: Seja a
gramatica:
E
E
E
E
+EE
EE
a
b
CAPITULO 3. ANALISE
SINTATICA
39
+EE
EE
a
b
=
=
=
=
=
=
{}
{E
{E
{E
{}
{E
CAPITULO 3. ANALISE
SINTATICA
40
E#
+EE
EE
a
b
=
=
=
=
=
=
e7 =
e8 =
F ECHO({E 0 E#}) = {E 0 E#
E + EE| EE| a| b}
T RAN SF ERE(e0 , E) = {E 0 E #}
T RAN SF ERE(e0 , +) = {E + EE| +EE| EE| a| b}
T RAN SF ERE(e0 , ) = {E EE| +EE| EE| a| b}
T RAN SF ERE(e0 , a) = {E a}
T RAN SF ERE(e0 , a) = {E b}
T RAN SF ERE(e2 , E) = {E +E E| +EE| EE| a| b}
T RAN SF ERE(e2 , +) = e2
T RAN SF ERE(e2 , ) = e3
T RAN SF ERE(e2 , a) = e4
T RAN SF ERE(e2 , b) = e5
T RAN SF ERE(e3 , E) = {E E E| +EE| EE| a| b}
T RAN SF ERE(e3 , +) = e2
T RAN SF ERE(e3 , ) = e3
T RAN SF ERE(e3 , a) = e4
T RAN SF ERE(e3 , b) = e5
T RAN SF ERE(e6 , E) = {E +EE}
T RAN SF ERE(e6 , +) = e2
T RAN SF ERE(e6 , ) = e3
T RAN SF ERE(e6 , a) = e4
T RAN SF ERE(e6 , b) = e5
CAPITULO 3. ANALISE
SINTATICA
e9 =
41
E
e1
+
e2
*
e3
a
e4
b
e5
e6
e7
e2
e2
r3
r4
e2
e2
r1
r2
e3
e3
r3
r4
e3
e3
r1
r2
e4
e4
r3
r4
e4
e4
r1
r2
e5
e5
r3
r4
e5
e5
r1
r2
#
a
e8
e9
r3
r4
r1
r2
3.3
As gramaticas para Yacc estao definidas usando uma notacao similar a notacao de
Backus Naur Form (BNF). Esta tecnica foi criada por John Backus e Peter Naur, e
usada para descrever a sintaxe de ALGOL60. Uma gramatica BNF pode ser usada para
CAPITULO 3. ANALISE
SINTATICA
42
EE
Ez
E+Ez
E+yz
x+yz
(r2)
(r3)
(r1)
(r3)
(r3)
A cada passo expande-se um termo, trocando um smbolo nao-terminal no lado esquerdo de um regra pela sequencia de smbolos terminais e/ou nao terminais no lado
direito da mesma regra. O n
umero no lado direito indica que regra foi aplicada. Para
analisar a expressao, nos usamos uma operacao inversa. Ao inves de comecar com o
smbolo nao-terminal inicial e gerar a expressao da gramatica, nos devemos reduzir a
expressao para um u
nico smbolo nao-terminal (o smbolo inicial). Este metodo, mais
simples de implementar e chamado de analise ascendente ou analise de reducao e deslocamento (bottom-up or shift-reduce parsing), e usa uma pilha para armazenar os termos.
Aqui esta o mesma da derivacao, mas em ordem inversa:
1
2
3
4
5
6
7
8
9
10
11
x + y z
x +y z
E +y z
E + y z
E + y z
E + E z
E + E z
E + E z
E + E E
E + E
E
shif t
reduce(r3)
shif t
shif t
reduce(r3)
shif t
shif t
reduce(r3)
reduce(r2) emit multiply
reduce(r1) emit add
accept
CAPITULO 3. ANALISE
SINTATICA
43
tenhamos deslocado todos os smbolos para a pilha e somente o smbolo nao terminal
inicial permanecer na pilha. No passo 1 nos deslocamos o x para a pilha. No passo 2
nos aplicamos a regra r3 para a pilha, trocando o smbolo x por um E. Nos continuamos
deslocando e reduzindo, ate que um u
nico nao terminal, o smbolo inicial, permaneca na
pilha. No passo 9, quando nos reduzimos usando a regra r2, escrevemos a instrucao de
multiplicacao. Da mesma forma, escrevemos a instrucao de soma no passo 10. Portanto
a multiplicacao tem precedencia maior que a soma.
Considere, entretanto, o deslocamento no passo 6. Ao inves de deslocar, nos poderamos ter reduzido, aplicando a regra r1. Isto resultaria na adicao tendo maior precedencia que a multiplicacao. Isto e conhecido como conflito de reducao-deslocamento
(shift-reduce conflict). Nossa gramatica e ambgua, pois existe mais de uma derivacao
que produzira a expressao. Neste caso, a precedencia dos operadores e afetada. Outro
exemplo, a associatividade na regra:
E E+E
e ambgua, pois podemos recursivamente substituir o nao terminal mais `a esquerda ou
mais a` direita na regra. Para resolver esta situacao, nos deveramos reescrever a gramatica,
ou indicar para Yacc a precedencia que existe entre os operadores. O u
ltimo metodo e
mais simples e sera demonstrado numa pratica posterior.
A seguinte gramatica tem um conflito de reducao e reducao. Com um id na pilha nos
podemos reduzir para T ou reduzir para E.
E T
E id
T id
Yacc executa uma acao default quando ha um conflito. Para conflito de reducaodeslocamento, yacc deslocara o smbolo para pilha. Para conflito de reducao-reducao ele
usara a primeira regra da listagem. Ele tambem apresenta uma mensagem indicando a
existencia do conflito. O aviso pode ser excludo tornando a gramatica nao ambgua.
Varios metodos para remover ambig
uidade serao apresentados na secao seguinte.
Implementac
ao de uma calculadora de express
oes usando Yacc
1
2
3
4
5
. . . definicoes . . .
%%
. . . regras . . .
%%
. . . subrotinas . . .
%token INTEGER
CAPITULO 3. ANALISE
SINTATICA
44
Esta definicao declara um token INTEGER. Quando nos rodamos yacc, ele gera o
analisador sintatico (parser) no arquivo y.tab.c, e tambem cria um arquivo (include file),
y.tab.h:
1
2
3
4
5
#i f n d e f YYSTYPE
#define YYSTYPE int
#endif
#define INTEGER 258
extern YYSTYPE y y l v a l ;
Lex inclui este arquivo e utiliza a definicao para o valor do token. Para obter tokens,
yacc chama yylex. A funcao yylex e do tipo int, e retorna o codigo numerico do token.
Valores associados com o token sao retornados por lex na variavel yylval. Por exemplo,
1
[0 9]+
{
yylval = at o i ( yytext ) ;
return INTEGER;
2
3
[+]
return y y t e x t ;
/ r e t u r n o p e r a t o r /
sera retornado o valor caracter para os operadores de subtracao e soma. Note que nos
colocamos o caracter menos antes do caracter mais porque senao ele poderia ser confundido
com o designador de intervalo numa classe de caracteres. Os valores do tokens gerados
comecam normalmente do valor 258 (Lex ainda reseva alguns valores para fim de arquivo
e codigos de erro). Aqui esta uma especificacao lex completa para nossa calculadora:
1
%{
#i n c l u d e y . tab . h
#i n c l u d e < s t d l i b . h>
void y y e r r o r ( char ) ;
2
3
4
5
%}
6
7
%%
8
9
[0 9]+
{
yylval = at o i ( yytext ) ;
return INTEGER;
10
11
12
13
14
[+\n ]
return y y t e x t ;
[ \t ]
; / s k i p w h i t e s p a c e /
15
16
17
18
19
20
%%
21
22
23
24
CAPITULO 3. ANALISE
SINTATICA
45
%{
int y y l e x ( void ) ;
void y y e r r o r ( char ) ;
2
3
4
%}
5
6
7
%token INTEGER
8
9
%%
10
11
program :
12
13
14
program expr \n
|
;
{ p r i n t f ( %d\n , $2 ) ; }
INTEGER
| expr + expr
| expr expr
;
{ $$ = $1 ; }
{ $$ = $1 + $3 ; }
{ $$ = $1 $3 ; }
15
16
expr :
17
18
19
20
21
22
%%
23
24
25
26
void y y e r r o r ( char s ) {
p r i n t f ( %s \n , s ) ;
}
27
28
29
30
31
{ $$ = $1 + $3 ; }
Nos trocamos o lado direito da regra de producao na pilha de analise com o smbolo
nao terminal no lado esquerdo da mesma regra. Neste caso nos desempilhamos expr +
expre empilhamos expr. Nos reduzimos a pilha desempilhando tres termos e empilhando de volta um termo. Nos podemos referenciar as posicoes na pilha de valores no
codigo em C especificando $1para o primeiro termo no lado direito da regra de producao,
$2para o segundo termo, e assim por diante. $$determina o valor do topo da pilha
depois que a reducao e executada. As acoes acima adicionam os valores associados com
CAPITULO 3. ANALISE
SINTATICA
46
as duas expressoes, desempilha tres termos da pilha, e empilha de volta a soma. Entao a
pilha de analise e de valores permanecem sincronizadas.
Os valores numericos estao inicialmente todos na pilha quanto reduzimos de INTEGER
para expr. Depois que INTEGER e deslocado para a pilha, aplicamos a regra:
1
expr : INTEGER
{ $$ = $1 ; }
user :
calc :
user :
user :
user :
calc :
user :
calc :
user :
calc :
3
27
x =
y =
x
27
y
5
x +
37
(4 + 5)
3 (5 + 4)
5
2 y
%{
#i n c l u d e < s t d l i b . h>
#i n c l u d e y . tab . h
void y y e r r o r ( char ) ;
2
3
4
5
%}
6
7
%%
8
9
10
11
12
/ v a r i a b l e s /
[ az ]
{
yylval = yytext a ;
return VARIABLE;
CAPITULO 3. ANALISE
SINTATICA
47
13
14
15
16
17
18
19
/ i n t e g e r s /
[0 9]+
{
yylval = at o i ( yytext ) ;
return INTEGER;
}
20
21
22
/ o p e r a t o r s /
[ +()=/ \n ] { r e t u r n y y t e x t ; }
23
24
25
/ s k i p w h i t e s p a c e /
[ \t ]
;
26
27
28
/ a n y t h i n g e l s e i s an e r r o r /
yyerror ( invalid character ) ;
29
30
%%
31
32
33
34
4
5
%{
void y y e r r o r ( char ) ;
int y y l e x ( void ) ;
int sym [ 2 6 ] ;
6
7
8
9
%}
10
11
%%
12
13
program :
program s t a t e m e n t \n
|
;
14
15
16
17
18
19
20
21
statement :
expr
| VARIABLE = expr
;
{ p r i n t f ( %d\n , $1 ) ; }
{ sym [ $1 ] = $3 ; }
22
23
24
25
expr :
INTEGER
| VARIABLE
{ $$ = sym [ $1 ] ; }
CAPITULO 3. ANALISE
SINTATICA
|
|
|
|
|
;
26
27
28
29
30
31
expr +
expr
expr
expr /
( expr
expr
expr
expr
expr
)
{
{
{
{
{
48
$$
$$
$$
$$
$$
=
=
=
=
=
$1 + $3 ;
$1 $3 ;
$1 $3 ;
$1 / $3 ;
$2 ; }
}
}
}
}
32
33
%%
34
35
36
37
void y y e r r o r ( char s ) {
p r i n t f ( %s \n , s ) ;
}
38
39
40
41
42
3.4
Analisador Sint
atico para a Linguagem Simples
CAPITULO 3. ANALISE
SINTATICA
49
%token
%token
%token
%token
%token
%token
%token
%token
%token
%token
%token
%token
%token
%token
%token
%token
T PROGRAMA
T INICIO
T FIM
T IDENTIF
T LEIA
T ESCREVA
T ENQTO
T FACA
T FIMENQTO
T SE
T ENTAO
T SENAO
T FIMSE
T ATRIB
T VEZES
T DIV
CAPITULO 3. ANALISE
SINTATICA
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
%token
%token
%token
%token
%token
%token
%token
%token
%token
%token
%token
%token
%token
%token
%token
50
T MAIS
T MENOS
T MAIOR
T MENOR
T IGUAL
TE
T OU
TV
TF
T NUMERO
T NAO
T ABRE
T FECHA
T LOGICO
T INTEIRO
Os codigos utilizados aqui sao os mesmos retornados pelo analisador lexico. Basta
incluir o arquivo de cabecalho que e gerado com a declaracao dessas contantes pela ferramenta bison.
Como pode ser observado, a gramatica de expressoes usada na linguagem Simples e
ambgua. Essa ambiguidade e resolvida definindo-se prioridade entre as operacoes para a
ferramenta Yacc. Fazemos isso com a seguinte declaracao:
1
2
3
4
5
%l e f t
%l e f t
%l e f t
%l e f t
%l e f t
T E T OU
T IGUAL
T MAIOR T MENOR
T MAIS T MENOS
T VEZES T DIV
programa
: c a b e c a l h o v a r i a v e i s T INICIO l i s t a c o m a n d o s T FIM
;
4
5
6
7
cabecalho
: T PROGRAMA T IDENTIF
;
8
9
10
11
12
variaveis
: / v a z i o /
| declaracao variaveis
;
13
14
15
16
17
declaracao variaveis
: tipo l i s t a v a r i a v e i s declaracao variaveis
| tipo l i s t a v a r i a v e i s
;
18
19
20
21
22
tipo
: T LOGICO
| T INTEIRO
;
CAPITULO 3. ANALISE
SINTATICA
23
24
25
26
27
lista variaveis
: T IDENTIF l i s t a v a r i a v e i s
| T IDENTIF
;
28
29
30
31
32
lista comandos
: / v a z i o /
| comando l i s t a c o m a n d o s
;
33
34
35
36
37
38
39
comando
:
|
|
|
;
entrada saida
repeticao
selecao
atribuicao
40
41
42
43
44
entrada saida
: leitura
| escrita
;
45
46
47
48
leitura
: T LEIA T IDENTIF
;
49
50
51
52
escrita
: T ESCREVA e x p r e s s a o
;
53
54
55
56
repeticao
: T ENQTO e x p r e s s a o T FACA l i s t a c o m a n d o s T FIMENQTO
;
57
58
59
60
selecao
: T SE e x p r e s s a o T ENTAO l i s t a c o m a n d o s T SENAO l i s t a c o m a n d o s
T FIMSE
;
61
62
63
64
atribuicao
: T IDENTIF T ATRIB e x p r e s s a o
;
65
66
67
68
69
70
71
72
73
74
75
76
77
expressao
: expressao
| expressao
| expressao
| expressao
| expressao
| expressao
| expressao
| expressao
| expressao
| termo
;
78
79
termo
T VEZES e x p r e s s a o
T DIV e x p r e s s a o
T MAIS e x p r e s s a o
T MENOS e x p r e s s a o
T MAIOR e x p r e s s a o
T MENOR e x p r e s s a o
T IGUAL e x p r e s s a o
T E expressao
T OU e x p r e s s a o
51
CAPITULO 3. ANALISE
SINTATICA
80
81
82
83
84
85
86
:
|
|
|
|
|
;
T IDENTIF
T NUMERO
TV
TF
T NAO termo
T ABRE e x p r e s s a o T FECHA
52
Captulo 4
MVS - M
aquina Virtual Simples
O objetivo principal do compilador para uma linguagem de programacao e construir
uma ferramenta de traducao que transforme os codigos numa linguagem de alto nvel para
instrucoes numa linguagem de maquina que possibilite a sua execucao.
Entretanto, traduzir para a linguagem de maquina de um computador real e, em geral,
uma tarefa muito trabalhosa. Envolve o conhecimento profundo da maquina alvo. Por
exemplo, o conjunto de instrucoes de uma maquina INTEL contem centenas de instrucoes,
que variam em cada versao do processador e que uma dezena de detalhes que devem ser
observados para a sua apropriada utilizacao.
Ao inves de traduzir, entao, os programas-fonte para a linguagem de maquina de um
computador real, definiremos uma maquina hipotetica, mais conveniente para o desenvolvimento de um compilador didatico. Desta forma, poderemos dar mais atencao para os
detalhes do compilador sem termos que nos preocupar com detalhes de uma maquina real.
Como efeito colateral, estaremos desenvolvendo um compilador de codigo 100% portavel
(como acontece com o codigo-objeto JAVA). A partir do momento que o programa estiver
traduzido para codigo desta maquina hipotetica (maquina virtual), basta ter o programa
de interpreta estes codigos para executar o programa em qualquer plataforma (arquitetura+sistema operacional).
4.1
CAPITULO 4. MVS - MAQUINA
VIRTUAL SIMPLES
54
2. O registrador s indicara o elemento no topo da pilha cujo valor sera dado, portanto,
por M [s]. Grande parte das instrucoes da MVS sao relativas as posicoes do topo da
pilha M , conforme sera apresentado na proxima secao.
3. O registrador de base d que contem o endereco de base no qual a variavel esta inserida. Esse u
nico registrador e suficiente para generalizar a forma de enderecamento
das variaveis locais e globais no programa. O enderecamento de variavel global pode
ser mais simples, no entanto, por questao de simplificacao da maquina, usaremos
enderecamento indireto para variaveis locais e globais.
Uma vez que o programa MVS esta carregado na regiao P , e os registradores tem seus
valores iniciais, o funcionamento da maquina e muito simples. As instrucoes indicadas
pelo registrador i sao executadas ate que seja encontrada uma instrucao de parada ou
um erro. A execucao de cada instrucao incrementa i de uma unidade para posicionar na
proxima instrucao do programa, i i + 1, exceto as instrucoes que envolvem desvio.
4.1.1
Descri
c
ao das instruc
oes MVS
Traduc
ao de Express
oes
Como a maquina MVS e baseada em pilha, as expressoes em notacao infixa (com o
operacao entre os operandos) da linguagem fonte devem ser traduzidas para uma sequencia
de instrucoes em NPR (Notacao Polonesa Reversa, na qual a operacao e colocada apos
os seus operandos). A avaliacao de expressoes em NPR pela maquina baseada em pilha e
trivial.
CAPITULO 4. MVS - MAQUINA
VIRTUAL SIMPLES
Instruc
ao
CRCT k
CRVG n
ARZG n
CMMA
CMME
CMIG
DISJ
CONJ
NEGA
SOMA
SUBT
MULT
DIVI
DSVS p
DSVF p
LEIA
ESCR
NADA
INPP
FIMP
AMEM n
55
CAPITULO 4. MVS - MAQUINA
VIRTUAL SIMPLES
56
CRVG
CRVG
CRCT
SOMA
MULT
CRVG
SUBT
3
1
10
CRVG
CRVG
SOMA
ARZG
10
12
12
Traduc
ao do comando de repetic
ao e selec
ao
Para traduzir os comandos de repeticao e selecao sao usados as instrucoes de desvio
condicional DSVF (Desvia se Falso), o desvio incondicional DSVS (Desvia Sempre) e a
instrucao NADA para receber o rotulo para onde sera realizado o desvio da execucao do
programa MVS. O micro-codigo dessas instrucoes esta sintetizado na tabela seguinte:
Instruc
ao Micro-c
odigo
DSVS p
ip
DSVF p
SE M [s] = 0 ENTAO i p SENAO i i + 1
ss1
NADA
Nao faz nada
O operando p nas instrucoes DSVF e DSVS determinam um rotulo dentro do proprio
codigo MVS para onde a execucao devera ou nao ser desviada.
CAPITULO 4. MVS - MAQUINA
VIRTUAL SIMPLES
57
1
2
3
4
5
L1
9
10
11
L2
CRCT
ARZG
CRVG
DSVF
CRCT
ARZG
DSVS
NADA
CRCT
ARZG
NADA
1
0
0
L1
0
0
L2
1
0
CAPITULO 4. MVS - MAQUINA
VIRTUAL SIMPLES
58
1
2
3
4
L1
4
5
6
7
8
9
10
11
12
13
L2
CRCT
ARZG
NADA
CRVG
CRCT
CMME
DSVF
CRCT
CRVG
MULT
ARZG
DSVS
NADA
1
0
0
10
L2
2
0
0
L1
Traduc
ao dos comandos de entrada e sada
Para traducao dos comandos leia V e escreva E, onde V e uma variavel e E uma
expressao, usaremos as instrucoes MVS:
Instruc
ao Micro-c
odigo
LEIA
ss+1
M [s] Entrada
ESCR
Escreve M [s]
ss1
CAPITULO 4. MVS - MAQUINA
VIRTUAL SIMPLES
59
Para traducao do leia X, primeiro gera-se uma instrucao LEIA e o resultado lido deve
ser armazenado na variavel X.
Para traducao de escreva A + B, primeiro traduz-se a expressao A + B e, ao final,
gera-se uma instrucao ESCR, para que o resultado a expressao seja apresentado na sada
padrao.
Exemplo 5 Considere o seguinte trecho de programa com comandos de leitura e escrita
em linguagem Simples:
1
2
3
leia A
leia B
escreva A + B
A traducao MVS e:
1
2
3
4
5
6
7
8
LEIA
ARZG
LEIA
ARZG
CRVG
CRVG
SOMA
ESCR
0
1
0
1
programa r e p e t e
inteiro i j
inicio
i < 1
e n q u a n t o i < 10 f a c a
j < 1
e n q u a n t o j < 10 f a c a
CAPITULO 4. MVS - MAQUINA
VIRTUAL SIMPLES
8
9
10
11
12
13
escreva i + j
j < j + 1
fimenquanto
i < i + 1
fimenquanto
fimprograma
A traducao MVS e:
1
2
3
4
5
L1
6
7
8
9
10
11
12
L3
13
14
15
16
17
18
19
20
21
22
23
24
25
26
L4
27
28
29
30
31
32
33
L2
INPP
AMEM
CRCT
ARZG
NADA
CRVG
CRCT
CMME
DSVF
CRCT
ARZG
NADA
CRVG
CRCT
CMME
DSVF
CRVG
CRVG
SOMA
ESCR
CRVG
CRCT
SOMA
ARZG
DSVS
NADA
CRVG
CRCT
SOMA
ARZG
DSVS
NADA
FIMP
2
1
0
0
10
L2
1
1
1
10
L4
0
1
1
1
1
L3
0
1
0
L1
60
Captulo 5
An
alise Sem
antica e Gera
c
ao de
C
odigo
Nesse captulo estao apresentadas as modificacoes do analisador lexico e analisador
sintatico para possibilitar algumas verificacoes semanticas e a geracao do codigo Simples
para Maquina MVS.
5.1
1
2
3
4
5
Func
oes Utilit
arias
/
E s t r u t u r a s e R o t i n a s U t i l i t a r i a s do Compilador
Por L u i z Eduardo da S i l v a
/
6
7
8
9
10
11
/
L i m i t e s das e s t r u t u r a s
/
#define TAM TSIMB 100 / Tamanho da t a b e l a de s i m b o l o s /
#define TAM PSEMA 100 / Tamanho da p i l h a s e m a n t i c a
/
12
13
14
15
16
17
18
19
20
21
22
23
/
Variaveis globais
/
int TOPO TSIMB
= 0 ; / TOPO da t a b e l a de s i m b o l o s /
int TOPO PSEMA
= 0 ; / TOPO da p i l h a s e m a n t i c a /
int ROTULO
= 0 ; / Proximo numero de r o t u l o /
int CONTA VARS
= 0 ; / Numero de v a r i a v e i s /
int POS SIMB ;
/ Pos . na t a b e l a de s i m b o l o s /
int aux ;
/ v a r i a v e l a u x i l i a r /
int numLinha = 1 ; / numero da l i n h a no programa /
char atomo [ 3 0 ] ;
/ nome de um i d e n t i f . ou numero /
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/
Rotina g e r a l de t r a t a m e n t o de e r r o
/
void ERRO ( char msg , . . . ) {
char formato [ 2 5 5 ] ;
v a l i s t arg ;
v a s t a r t ( arg , msg ) ;
s p r i n t f ( formato , \n%d : , numLinha ) ;
s t r c a t ( formato , msg ) ;
s t r c a t ( formato , \n\n ) ;
p r i n t f ( \nERRO no programa ) ;
v p r i n t f ( formato , a r g ) ;
va end ( a r g ) ;
61
DE CODIGO
CAPITULO 5. ANALISE
SEMANTICA
E GERAC
AO
exit (1) ;
38
39
40
41
42
43
44
45
46
47
/
Tabela de S i m b o l o s
/
struct e l e m t a b s i m b o l o s {
char i d [ 3 0 ] ;
int d e s l o c a ;
} TSIMB [ TAM TSIMB ] , e l e m t a b ;
48
49
50
51
52
/
P i l h a Semantica
/
int PSEMA[TAM PSEMA ] ;
53
54
55
56
57
58
59
60
61
62
63
64
65
/
Funcao que BUSCA um s i m b o l o na t a b e l a de s i m b o l o s .
Retorna 1 s e o s i m b o l o nao e s t a na t a b e l a
Retorna i , onde i e o i n d i c e do s i m b o l o na t a b e l a
s e o s i m b o l o e s t a na t a b e l a
/
int b u s c a s i m b o l o ( char i d e n t )
{
int i = TOPO TSIMB1;
f o r ( ; strcmp (TSIMB [ i ] . id , i d e n t ) && i >= 0 ; i ) ;
return i ;
}
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/
Funcao que INSERE um s i m b o l o na t a b e l a de s i m b o l o s .
interrompido .
/
void i n s e r e s i m b o l o ( struct e l e m t a b s i m b o l o s elem )
{
i f (TOPO TSIMB == TAM TSIMB) {
ERRO ( OVERFLOW t a b e l a de s i m b o l o s ) ;
}
else {
POS SIMB = b u s c a s i m b o l o ( elem>i d ) ;
i f (POS SIMB != 1) {
ERRO ( I d e n t i f i c a d o r [% s ] d u p l i c a d o , elem>i d ) ;
}
TSIMB [ TOPO TSIMB ] = elem ;
TOPO TSIMB++;
}
}
87
88
89
90
91
92
93
94
95
/
Funcao de i n s e r c a o de uma v a r i a v e l na t a b e l a de s i m b o l o s
/
void i n s e r e v a r i a v e l ( char i d e n t ) {
s t r c p y ( e l e m t a b . id , i d e n t ) ;
e l e m t a b . d e s l o c a = CONTA VARS;
i n s e r e s i m b o l o (& e l e m t a b ) ;
62
DE CODIGO
CAPITULO 5. ANALISE
SEMANTICA
E GERAC
AO
96
97
98
99
100
101
102
103
104
105
106
/
R o t i n a s para manutencao da PILHA SEMANTICA
/
void empilha ( int n ) {
i f (TOPO PSEMA == TAM PSEMA) {
ERRO ( OVERFLOW P i l h a Semantica ) ;
}
PSEMA[TOPO PSEMA++] = n ;
}
107
108
109
110
111
112
113
int d e s e m p i l h a ( ) {
i f (TOPO PSEMA == 0 ) {
ERRO ( UNDERFLOW P i l h a Semantica ) ;
}
return PSEMA[TOPO PSEMA ] ;
}
5.2
1
Modificac
ao do analisador l
exico
%{
2
3
#include s i n t a t i c o . h
4
5
%}
6
7
8
9
10
identificador
numero
espaco
novalinha
11
12
%x c o m e n t a r i o
13
14
%%
15
16
17
18
programa
inicio
fimprograma
return T PROGRAMA;
return T INICIO ;
return T FIM ;
leia
escreva
return T LEIA ;
return T ESCREVA ;
se
entao
senao
fimse
return
return
return
return
enquanto
faca
fimenquanto
return T ENQTO;
return T FACA ;
return T FIMENQTO;
div
return
return
return
return
19
20
21
22
23
24
25
26
T SE ;
T ENTAO;
T SENAO ;
T FIMSE ;
27
28
29
30
31
32
33
34
35
T MAIS ;
T MENOS;
T VEZES ;
T DIV ;
63
DE CODIGO
CAPITULO 5. ANALISE
SEMANTICA
E GERAC
AO
36
37
38
39
>
<
=
return T MAIOR ;
return T MENOR;
return T IGUAL ;
e
ou
nao
return T E ;
return T OU ;
return T NAO ;
<
(
)
return T ATRIB ;
return T ABRE ;
return T FECHA ;
inteiro
logico
V
F
return
return
return
return
40
41
42
43
44
45
46
47
48
49
50
51
52
T INTEIRO ;
T LOGICO ;
T V;
T F;
53
54
55
56
57
58
59
{ i d e n t i f i c a d o r } { s t r c p y ( atomo , y y t e x t ) ;
return T IDENTIF ; }
{numero}
{ s t r c p y ( atomo , y y t e x t ) ;
return T NUMERO; }
{ espaco }
/ nao f a z nada /
{ novalinha }
numLinha++;
60
61
// .
/ c o m e n t a r i o de l i n h a /
62
63
64
65
66
/
<comentario > /
<comentario >.
<comentario >\n
BEGIN( c o m e n t a r i o ) ;
BEGIN( INITIAL ) ;
/ nao f a z nada /
numLinha++;
67
68
69
70
%%
5.3
1
2
3
4
5
Modificac
ao do analisador sint
atico
A N A L I S A D O R
S I N T A T I C O
Por L u i z Eduardo da S i l v a
JANEIRO2013
/
6
7
8
9
10
11
%{
#include
#include
#include
#include
<s t d i o . h>
<s t r i n g . h>
< s t d l i b . h>
<s t d a r g . h>
12
13
14
15
#include u t i l s . c
#include l e x i c o . c
%}
16
17
18
// Simbolo de p a r t i d a
%s t a r t programa
64
DE CODIGO
CAPITULO 5. ANALISE
SEMANTICA
E GERAC
AO
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// S i m b o l o s t e r m i n a i s
%token T PROGRAMA
%token T INICIO
%token T FIM
%token T IDENTIF
%token T LEIA
%token T ESCREVA
%token T ENQTO
%token T FACA
%token T FIMENQTO
%token T SE
%token T ENTAO
%token T SENAO
%token T FIMSE
%token T ATRIB
%token T VEZES
%token T DIV
%token T MAIS
%token T MENOS
%token T MAIOR
%token T MENOR
%token T IGUAL
%token T E
%token T OU
%token T V
%token T F
%token T NUMERO
%token T NAO
%token T ABRE
%token T FECHA
%token T LOGICO
%token T INTEIRO
52
53
54
55
56
57
58
// P r e c e d e n c i a e a s s o c i a t i v i d a d e
%l e f t T E T OU
%l e f t T IGUAL
%l e f t T MAIOR T MENOR
%l e f t T MAIS T MENOS
%l e f t T VEZES T DIV
59
60
%%
61
62
63
64
65
66
67
68
69
70
// Regras de producao
programa
: cabecalho
{ p r i n t f ( \tINPP\n ) ; }
variaveis
T INICIO l i s t a c o m a n d o s
T FIM
{ p r i n t f ( \tFIMP\n ) ; }
;
71
72
73
74
cabecalho
: T PROGRAMA T IDENTIF
;
75
76
variaveis
65
DE CODIGO
CAPITULO 5. ANALISE
SEMANTICA
E GERAC
AO
:
|
;
77
78
79
/ v a z i o /
declaracao variaveis
80
81
82
83
84
85
86
87
88
89
90
91
declaracao variaveis
: declaracao variaveis
tipo
{ CONTA VARS = 0 ; }
lista variaveis
{ p r i n t f ( \tAMEM\ t%d\n , CONTA VARS) ; }
| tipo
{ CONTA VARS = 0 ; }
lista variaveis
{ p r i n t f ( \tAMEM\ t%d\n , CONTA VARS) ; }
;
92
93
94
95
96
tipo
: T LOGICO
| T INTEIRO
;
97
98
99
100
101
lista variaveis
: lista variaveis
T IDENTIF
{ i n s e r e v a r i a v e l ( atomo ) ; CONTA VARS++; }
102
103
104
105
| T IDENTIF
{ i n s e r e v a r i a v e l ( atomo ) ; CONTA VARS++; }
;
106
107
108
109
110
lista comandos
: / v a z i o /
| comando l i s t a c o m a n d o s
;
111
112
113
114
115
116
117
comando
:
|
|
|
;
entrada saida
repeticao
selecao
atribuicao
118
119
120
121
122
entrada saida
: leitura
| escrita
;
123
124
125
126
127
128
129
130
131
132
133
134
leitura
: T LEIA
T IDENTIF
{
POS SIMB = b u s c a s i m b o l o ( atomo ) ;
i f (POS SIMB == 1)
ERRO ( V a r i a v e l [% s ] nao d e c l a r a d a ! ,
atomo ) ;
else {
p r i n t f ( \tLEIA\n ) ;
p r i n t f ( \tARZG\ t%d\n ,
66
DE CODIGO
CAPITULO 5. ANALISE
SEMANTICA
E GERAC
AO
TSIMB [ POS SIMB ] . d e s l o c a ) ;
135
136
137
138
139
140
141
142
143
escrita
: T ESCREVA e x p r e s s a o
{ p r i n t f ( \tESCR\n ) ; }
;
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
repeticao
: T ENQTO
{
p r i n t f ( L%d\tNADA\n , ++ROTULO) ;
empilha (ROTULO) ;
}
expressao
T FACA
{
p r i n t f ( \tDSVF\ tL%d\n,++ROTULO) ;
empilha (ROTULO) ;
}
lista comandos
T FIMENQTO
{
aux = d e s e m p i l h a ( ) ;
p r i n t f ( \tDSVS\ tL%d\n , d e s e m p i l h a ( ) ) ;
p r i n t f ( L%d\tNADA\n , aux ) ;
}
;
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
selecao
: T SE
expressao
{
p r i n t f ( \tDSVF\ tL%d\n , ++ROTULO) ;
empilha (ROTULO) ;
}
T ENTAO
lista comandos
T SENAO
{
p r i n t f ( \tDSVS\ tL%d\n , ++ROTULO) ;
p r i n t f ( L%d\tNADA\n , d e s e m p i l h a ( ) ) ;
empilha (ROTULO) ;
}
lista comandos
T FIMSE
{
p r i n t f ( L%d\tNADA\n , d e s e m p i l h a ( ) ) ;
}
;
187
188
189
190
191
192
atribuicao
: T IDENTIF
{
POS SIMB = b u s c a s i m b o l o ( atomo ) ;
i f (POS SIMB == 1)
67
DE CODIGO
CAPITULO 5. ANALISE
SEMANTICA
E GERAC
AO
ERRO ( V a r i a v e l [% s ] nao d e c l a r a d a ! ,
atomo ) ;
193
194
else
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
expressao
: e x p r e s s a o T VEZES e x p r e s s a o
{ p r i n t f ( \tMULT\n ) ; }
| e x p r e s s a o T DIV e x p r e s s a o
{ p r i n t f ( \ tDIVI \n ) ; }
| e x p r e s s a o T MAIS e x p r e s s a o
{ p r i n t f ( \tSOMA\n ) ; }
| e x p r e s s a o T MENOS e x p r e s s a o
{ p r i n t f ( \tSUBT\n ) ; }
| e x p r e s s a o T MAIOR e x p r e s s a o
{ p r i n t f ( \tCMMA\n ) ; }
| e x p r e s s a o T MENOR e x p r e s s a o
{ p r i n t f ( \tCMME\n ) ; }
| e x p r e s s a o T IGUAL e x p r e s s a o
{ p r i n t f ( \tCMIG\n ) ; }
| expressao T E expressao
{ p r i n t f ( \tCONJ\n ) ; }
| e x p r e s s a o T OU e x p r e s s a o
{ p r i n t f ( \ tDISJ \n ) ; }
| termo
;
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
termo
: T IDENTIF
{
POS SIMB = b u s c a s i m b o l o ( atomo ) ;
i f (POS SIMB == 1)
ERRO ( V a r i a v e l [% s ] nao d e c l a r a d a ! ,
atomo ) ;
else {
p r i n t f ( \tCRVG\ t%d\n ,
TSIMB [ POS SIMB ] . d e s l o c a ) ;
}
}
| T NUMERO
{ p r i n t f ( \tCRCT\ t%s \n , atomo ) ; }
| TV
{ p r i n t f ( \tCRCT\ t 1 \n ) ; }
| TF
{ p r i n t f ( \tCRCT\ t 0 \n ) ; }
| T NAO termo
{ p r i n t f ( \tNEGA\n ) ; }
| T ABRE e x p r e s s a o T FECHA
;
247
248
249
250
%%
/++
|
Corpo p r i n c i p a l do programa COMPILADOR
|
68
DE CODIGO
CAPITULO 5. ANALISE
SEMANTICA
E GERAC
AO
251
++/
252
253
254
yywrap ( ) {
}
255
256
257
258
259
y y e r r o r ( char s )
{
ERRO ( ERRO SINTATICO ) ;
}
260
261
262
263
264
main ( )
{
yyparse ( ) ;
}
5.4
1
2
3
4
5
6
7
Simulador da M
aquina MVS
Por L u i z Eduardo da S i l v a
/
#include <s t d i o . h>
#include <s t r i n g . h>
#include < s t d l i b . h>
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/
Conjunto de i n s t r u c o e s mnemonicas da MVS
/
#define TOTALINST 21
char i n s t [ TOTALINST ] = {
CRVG , / Carrega v a l o r /
CRCT , / Carrega c o n s t a n t e /
SOMA , / Soma /
SUBT , / S u b t r a i /
MULT , / M u l t i p l i c a /
DIVI , / D i v i d e ( d i v i s a o i n t e i r a ) /
CMIG , / Compara s e i g u a l /
CMMA , / Compara s e maior /
CMME , / Compara s e menor /
CONJ , / Conjuncao e l o g i c o /
DISJ , / D i s j u n c a o ou l o g i c o /
NEGA , / Negacao nao l o g i c o /
ARZG , / Armazena na v a r i a v e l /
DSVS , / D e sv i a sempre /
DSVF , / D e sv i a s e f a l s o /
NADA , / Nada /
ESCR , / E s c r e v e /
LEIA , / Le /
INPP , / I n i c i a Programa P r i n c i p a l /
AMEM , / Aloca memoria /
FIMP / Fim do programa /
};
36
37
38
39
69
DE CODIGO
CAPITULO 5. ANALISE
SEMANTICA
E GERAC
AO
40
41
42
43
44
45
46
47
48
49
/
R e g i o e s do ambiente de e x e c u c a o da MVS
/
struct prog { int r , i , o ; }
P [ 5 0 0 ] ; / Regiao do Programa /
int
L [ 5 0 ] ; / P o s i c a o dos r o t u l o s /
int
M[ 5 0 0 ] ; / P i l h a M Dados do programa /
50
51
52
53
54
55
56
57
/
R o t i n a s da MVS
/
int b u s c a i n s t r u c a o ( char s ) ;
int c a r r e g a p r o g r a m a ( char s , int nro ) ;
void mostra programa ( int nro ) ;
void e x e c u t a p r o g r a m a ( void ) ;
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/
Funcao p r i n c i p a l .
Carrega o c o d i g o p a s s a d o em l i n h a de comando e e x e c u t a
/
main ( int argc , char argv [ ] ) {
int i , n r o i n s t ;
argc ;
argv++;
i f ( argc < 1) {
p u t s ( \nMVS Maquina V i r t u a l S i m p l e s ) ;
p u t s ( USO: mvs <nomedoarquivo . mvs>\n\n ) ;
exit (0) ;
}
i f ( c a r r e g a p r o g r a m a ( argv [ 0 ] , &n r o i n s t ) )
{
mostra programa ( n r o i n s t ) ;
executa programa ( ) ;
p r i n t f ( Fim do programa . \ n ) ;
}
return 1 ;
}
80
81
82
83
84
85
86
87
88
89
90
/
Funcao que c o d i f i c a as i n s t r u c o e s .
Recebe o nome da i n s t r u c a o e r e t o r n a um numero .
/
int b u s c a i n s t r u c a o ( char s )
{
int i ;
f o r ( i = TOTALINST1; i >= 0 && strcmp ( i n s t [ i ] , s ) ; i ) ;
return i ;
}
91
92
93
94
95
96
97
/
Carrega o programa MVS.
Recebe o nome do a r q u i v o com o programa para MVS e
r e t o r n a o numero de l i n h a s do programa .
/
int c a r r e g a p r o g r a m a ( char s , int nro )
70
DE CODIGO
CAPITULO 5. ANALISE
SEMANTICA
E GERAC
AO
98
{
FILE arq ;
char l i n h a [ 1 0 0 ] , p , s t r [ 6 ] ;
int j ;
99
100
101
102
i f ( ( arq = f o p e n ( s , r ) ) == NULL)
{
p u t s ( \n\ nErro na a b e r t u r a do a r q u i v o \n\n ) ;
return 0 ;
}
nro = 0 ;
while ( ! f e o f ( arq ) )
{
f g e t s ( l i n h a , 1 0 0 , arq ) ;
l i n h a [ s t r l e n ( l i n h a ) 1]= \0 ;
/
Tres t i p o s de i n s t r u c o e s :
1 . Com r o t u l o :
L1 : \tNADA\n
2 . Sem r o t u l o nem argumento :
\tINPP\n
3 . Com argumento :
\tCRCT\ t 4 \n
ou
\tDSVF\ tL1 \n
/
i f ( l i n h a [ 0 ] == L ) / t i p o 1 /
{
p = ( char ) s t r t o k ( l i n h a , \ t ) ;
p++;
P [ nro ] . r = a t o i ( p ) ;
P[ nro ] . i = b u s c a i n s t r u c a o ( NADA ) ;
P [ nro ] . o = 1;
L [ P [ nro ] . r ] = nro ;
}
e l s e / t i p o 2 ou 3 /
{
p = ( char ) s t r t o k ( l i n h a , \ t ) ;
P [ nro ] . r = 1;
P [ nro ] . i = b u s c a i n s t r u c a o ( p ) ;
p = ( char ) s t r t o k (NULL, \ t ) ;
i f ( ! p ) / t i p o 2 /
P [ nro ] . o = 1;
else
/ t i p o 3 /
{
i f ( p == L ) p++;
P [ nro ] . o = a t o i ( p ) ;
}
i f (P [ nro ] . i == TOTALINST1)
{
( nro )++;
break ; / INSTRUCAO FIM /
}
}
( nro )++; // proxima i n s t r u c a o
}
f c l o s e ( arq ) ;
return 1 ;
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
71
DE CODIGO
CAPITULO 5. ANALISE
SEMANTICA
E GERAC
AO
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
/
Funcao que e x e c u t a o programa MVS
A p a r t i r do v e t o r P ( programa ) p r e e n c h i d o , e x e c u t a uma
a uma as i n s t r u c o e s do programa .
/
void e x e c u t a p r o g r a m a ( void )
{
int i = 0 , s ;
char numstr [ 6 ] ;
while ( 1 ) {
switch (P [ i ] . i ) {
case CRCT : s++; M[ s ] = P [ i ] . o ; i ++;
break ;
case CRVG : s++; M[ s ] = M[ P [ i ] . o ] ; i ++;
break ;
case ARZG : M[ P [ i ] . o ] = M[ s ] ; s ; i ++;
break ;
case SOMA : M[ s 1] = M[ s 1] + M[ s ] ; s ; i ++;
break ;
case SUBT : M[ s 1] = M[ s 1] M[ s ] ; s ; i ++;
break ;
case MULT : M[ s 1] = M[ s 1] M[ s ] ; s ; i ++;
break ;
case DIVI : M[ s 1] = M[ s 1] / M[ s ] ; s ; i ++;
break ;
case CONJ : i f (M[ s 1] && M[ s ] ) M[ s 1]=1;
e l s e M[ s 1] = 0 ;
s ; i ++;
break ;
case DISJ : i f (M[ s 1] | | M[ s ] ) M[ s 1] = 1 ;
e l s e M[ s 1] = 0 ;
s ; i ++;
break ;
case NEGA : M[ s ] = 1M[ s ] ; i ++;
break ;
case CMME : i f (M[ s 1] < M[ s ] ) M[ s 1] = 1 ;
e l s e M[ s 1] = 0 ;
s ; i ++;
break ;
case CMMA : i f (M[ s 1] > M[ s ] ) M[ s 1] = 1 ;
e l s e M[ s 1] = 0 ;
s ; i ++;
break ;
case CMIG : i f (M[ s 1] == M[ s ] ) M[ s 1] = 1 ;
e l s e M[ s 1] = 0 ;
s ; i ++;
break ;
case DSVS : i = L [ P [ i ] . o ] ;
break ;
case DSVF : i f (M[ s ] == 0 ) i = L [ P [ i ] . o ] ;
72
DE CODIGO
CAPITULO 5. ANALISE
SEMANTICA
E GERAC
AO
214
215
case NADA
216
217
case FIMP
case LEIA
218
219
220
221
222
case ESCR
223
224
case AMEM
225
226
case INPP
227
228
default :
229
230
231
232
233
e l s e i ++; s ;
break ;
: i ++;
break ;
: p r i n t f ( \n\n ) ; return ;
: s++; p r i n t f ( ? ) ;
f g e t s ( numstr , 5 , s t d i n ) ;
M[ s ] = a t o i ( numstr ) ; i ++;
break ;
: p r i n t f ( \ nSaida = %d , M[ s ] ) ; s ; i ++;
break ;
: s = s + P [ i ] . o ; i ++;
break ;
: s = 1; i ++;
break ;
p u t s ( I n s t r u c a o MVS d e s c o n h e c i d a ! ) ;
exit (0) ;
73
Captulo 6
Instruco
es MVS para tradu
c
ao de rotinas
Instruc
ao
CRVL n
ARZL n
Armazena Local
CREL n
CREG n
CRVI n
ARMI n
Armazena Indireto
SVCP n
ENSP n
Entrada sub-programa
RTSP n
Retorno sub-programa
DMEM n
6.2
1
Descric
ao
Carrega valor local
Desaloca memoria
Modificac
ao da gram
atica para incluir rotinas
programa
: cabecalho
variaveis
subprogramas
T INICIO
lista comandos
;
2
3
4
5
T FIM
6
7
(...)
8
9
10
11
12
Micro-c
odigo
ss+1
M [s] M [d + n]
M [d + n] M [s]
ss1
ss+1
M [s] d + n
ss+1
M [s] n
ss+1
M [s] M [M [d + n]]
M [M [d + n]] M [s]
ss1
ss+1
M [s] i + 2
ss+1
M [s] d
ds+1
d M [s]
i M [s 1]
s s (n + 2)
ssn
subprogramas
: / Nao tem subprogramas /
| lista subprogramas
;
74
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
13
14
15
16
17
18
19
20
lista subprogramas
: subprograma l i s t a s u b p r o g r a m a s
| subprograma
;
subprograma
: funcao
| procedimento
;
21
22
funcao
: T FUNC t i p o T IDENTIF T ABRE l i s t a p a r a m e t r o s T FECHA
v a r i a v e i s T INICIO l i s t a c o m a n d o s T FIMFUNC
;
23
24
25
26
27
28
29
30
31
;
procedimento
: T PROC T IDENTIF T ABRE l i s t a p a r a m e t r o s T FECHA
v a r i a v e i s T INICIO l i s t a c o m a n d o s T FIMPROC
;
32
33
34
35
36
lista parametros
: / sem p ar ame tr os /
| l i s t a p a r a m e t r o s parametro
;
37
38
39
40
41
42
43
44
forma passagem
: T REF
| / Vazio /
;
45
46
47
48
chamada procedimento
: T IDENTIF T ABRE argumentos
;
T FECHA
49
50
51
52
53
54
55
56
chamada funcao
: T IDENTIF T ABRE argumentos T FECHA
;
argumentos
: / nao tem argumentos /
| lista argumentos
;
57
58
59
60
61
lista argumentos
: l i s t a a r g u m e n t o s argumento
| argumento
;
62
63
64
65
argumento
: expressao
;
66
67
( . . . )
68
69
70
comando
: entrada saida
75
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
|
|
|
|
;
71
72
73
74
75
76
repeticao
selecao
atribuicao
chamada procedimento
76
77
( . . . )
78
79
termo
:
|
|
|
|
|
|
;
80
81
82
83
84
85
86
87
6.3
T IDENTIF
T NUMERO
TV
TF
T NAO termo
T ABRE e x p r e s s a o T FECHA
chamada funcao
Modificac
ao da Tabela de Smbolos
A Figura 6.1 ilustra as informacoes que devem estar disponveis na Tabela de Smbolos,
no incio do bloco da rotina e no incio do corpo principal para um programa exemplo.
As colunas da Tabela de Smbolos sao:
# - identifica a posicao do smbolo na tabela
id - e o nome do identificador, o nome escolhido pelo programador para a entidade
do programa
Esc - escopo da variavel. No caso da linguagem simples os smbolos so podem ter
escopo global (G) ou local (L).
Dsl - deslocamento (ou endereco) e o operando que acompanhara as variaveis na
instrucao CRVG, CRVL. As funcoes tambem tem valor para esse campo.
Rot - rotulo atribudo pelo compilador para a funcao ou procedimento. Essa informacao e necessaria para traducao da instrucao de desvio (DSVS) na chamada do
procedimento ou funcao.
Cat - categoria do smbolo que pode ser: VAR = variavel, PRO = procedimento,
FUN = funcao, PAR = parametro.
Tip - tipo do smbolo (INT = inteiro ou LOG = logico).
Mec - mecanismo de passagem para parametros que pode ser REF = referencia ou
VAL = valor.
Par - lista encadeada dos parametros da rotina, com seus Tipos e Mecanismos
de passagem de parametro. Essa informacao e necessaria para traduzir de forma
correta os parametros na chamada da rotina. Observe que no programa principal
as variaveis locais e parametros das rotinas sao excludos da tabela de smbolos
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
77
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
6.4
6.4.1
1
2
3
4
5
6
7
8
9
10
Exemplos de Tradu
c
ao de Procedimentos e Fun
co
es
Teste 1 - Simples
programa t e s t e 1
inteiro x
p r o c muda ( r e f i n t e i r o a )
inicio
a < 7
fimproc
inicio
muda ( x )
escreva x
fimprograma
C
odigo MVS correspondente:
1
2
3
4
L1
5
6
7
8
L0
9
10
11
12
13
14
15
6.4.2
1
2
3
4
5
6
7
8
INPP
AMEM
DSVS
ENSP
CRCT
ARMI
RTSP
NADA
CREG
SVCP
DSVS
CRVG
ESCR
DMEM
FIMP
1
L0
7
3
1
0
L1
0
1
Teste 2 - Simples
programa t e s t e 2
p r o c somatudo ( i n t e i r o a i n t e i r o b i n t e i r o c i n t e i r o d )
inicio
escreva a + b + c + d
fimproc
inicio
somatudo ( 1 0 3 4 8 )
fimprograma
C
odigo MVS correspondente:
1
2
3
4
5
6
7
L1
78
INPP
DSVS
ENSP
CRVL
CRVL
SOMA
CRVL
L0
6
5
4
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
8
9
10
11
12
13
L0
14
15
16
17
18
19
20
6.4.3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SOMA
CRVL
SOMA
ESCR
RTSP
NADA
CRCT
CRCT
CRCT
CRCT
SVCP
DSVS
FIMP
4
10
3
4
8
L1
Teste 3 - Simples
programa t e s t e 3
inteiro x
proc r e c u r s i v o ( i n t e i r o n)
inicio
se n > 0
entao e sc re v a n
r e c u r s i v o (n 1)
senao
fimse
fimproc
inicio
leia x
recursivo (x)
fimprograma
C
odigo MVS correspondente:
1
2
3
4
L1
5
6
7
8
9
10
11
12
13
14
15
16
17
18
L2
L3
19
20
21
22
L0
INPP
AMEM
DSVS
ENSP
CRVL
CRCT
CMMA
DSVF
CRVL
ESCR
CRVL
CRCT
SUBT
SVCP
DSVS
DSVS
NADA
NADA
RTSP
NADA
LEIA
ARZG
1
L0
3
0
L2
3
3
1
L1
L3
79
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
CRVG
SVCP
DSVS
DMEM
FIMP
23
24
25
26
27
6.4.4
1
2
3
4
5
6
7
8
9
10
11
12
13
0
L1
1
Teste 4 - Simples
programa t e s t e 4
inteiro n
func i n t e i r o f a t o r i a l ( i n t e i r o n)
inicio
se n = 0
e n t a o f a t o r i a l < 1
s e n a o f a t o r i a l < n f a t o r i a l ( n 1 )
fimse
fimfunc
inicio
leia n
escreva f a t o r i a l (n)
fimprograma
C
odigo MVS correspondente:
1
2
3
4
L1
5
6
7
8
9
10
11
12
L2
13
14
15
16
17
18
19
20
21
22
L3
23
24
25
26
27
28
29
30
31
L0
INPP
AMEM
DSVS
ENSP
CRVL
CRCT
CMIG
DSVF
CRCT
ARZL
DSVS
NADA
CRVL
AMEM
CRVL
CRCT
SUBT
SVCP
DSVS
MULT
ARZL
NADA
RTSP
NADA
LEIA
ARZG
AMEM
CRVG
SVCP
DSVS
ESCR
1
L0
3
0
L2
1
4
L3
3
1
3
1
L1
4
1
0
1
0
L1
80
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
DMEM
FIMP
32
33
6.4.5
1
2
3
4
5
6
7
8
9
10
11
12
Teste 5 - Simples
programa t e s t e 5
inteiro x y z
p r o c soma ( i n t e i r o a i n t e i r o b r e f i n t e i r o c )
inicio
c < a + b
fimproc
inicio
leia x
leia y
soma ( x y z )
escreva z
fimprograma
C
odigo MVS correspondente:
1
2
3
4
L1
5
6
7
8
9
10
L0
11
12
13
14
15
16
17
18
19
20
21
22
23
6.4.6
1
2
INPP
AMEM
DSVS
ENSP
CRVL
CRVL
SOMA
ARMI
RTSP
NADA
LEIA
ARZG
LEIA
ARZG
CRVG
CRVG
CREG
SVCP
DSVS
CRVG
ESCR
DMEM
FIMP
3
L0
5
4
3
3
0
1
0
1
2
L1
2
3
Teste 6 - Simples
programa t e s t e 6
inteiro z x
3
4
5
6
7
proc g ( i n t e i r o t )
inteiro y
inicio
y < t t
81
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
8
9
10
z < z + x + y
escreva z
fimproc
11
12
13
14
15
16
17
18
proc f 1 ( i n t e i r o x i n t e i r o y )
inteiro t
inicio
t < z + x + y
g( t )
z < t
fimproc
19
20
21
22
23
24
25
26
proc h ( i n t e i r o y )
inteiro x
inicio
x < y + 1
f1 (x y)
g(z + x)
fimproc
27
28
29
30
31
32
33
34
35
inicio
z < 1
x < 3
h(x)
g(x)
escreva x
escreva z
fimprograma
C
odigo MVS correspondente:
1
2
3
4
L1
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
L2
INPP
AMEM
DSVS
ENSP
AMEM
CRVL
CRVL
MULT
ARZL
CRVG
CRVG
SOMA
CRVL
SOMA
ARZG
CRVG
ESCR
DMEM
RTSP
ENSP
AMEM
CRVG
CRVL
SOMA
CRVL
SOMA
2
L0
1
3
3
0
0
1
0
0
0
1
1
1
0
4
3
82
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
27
28
29
30
31
32
33
34
35
L3
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
L0
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
6.4.7
1
2
3
4
5
6
7
8
9
10
11
ARZL
CRVL
SVCP
DSVS
CRVL
ARZG
DMEM
RTSP
ENSP
AMEM
CRVL
CRCT
SOMA
ARZL
CRVL
CRVL
SVCP
DSVS
CRVG
CRVL
SOMA
SVCP
DSVS
DMEM
RTSP
NADA
CRCT
ARZG
CRCT
ARZG
CRVG
SVCP
DSVS
CRVG
SVCP
DSVS
CRVG
ESCR
CRVG
ESCR
DMEM
FIMP
0
0
L1
0
0
1
2
1
3
1
0
0
3
L2
0
0
L1
1
1
1
0
3
1
1
L3
1
L1
1
0
2
Teste 7 - Simples
83
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
C
odigo MVS correspondente:
1
2
3
4
L1
5
6
7
8
9
10
L0
11
12
13
14
15
16
17
18
19
20
6.4.8
1
2
3
4
5
6
7
8
9
10
11
12
13
INPP
AMEM
DSVS
ENSP
LEIA
ARMI
LEIA
ARMI
RTSP
NADA
CREG
CREG
SVCP
DSVS
CRVG
CRVG
SOMA
ESCR
DMEM
FIMP
2
L0
4
3
2
0
1
L1
0
1
Teste 8 - Simples
C
odigo MVS correspondente:
1
2
3
4
L1
5
6
7
8
9
10
11
12
13
14
L0
INPP
AMEM
DSVS
ENSP
AMEM
CRVL
CRVL
SOMA
ARZL
CRVL
ESCR
DMEM
RTSP
NADA
2
L0
1
4
3
0
0
1
2
84
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
LEIA
ARZG
LEIA
ARZG
CRVG
CRVG
SVCP
DSVS
DMEM
FIMP
15
16
17
18
19
20
21
22
23
24
6.4.9
1
2
3
0
1
0
1
L1
2
Teste 9 - Simples
programa t s u b p r o g r a m a s
inteiro a b c
l o g i c o f 1 k4 y5
4
5
6
7
8
9
10
11
12
13
proc t e s t ( l o g i c o l o l i n t e i r o a i n t e i r o b)
i n t e i r o a1 a2 a3 a4 a5
inicio
se l o l entao
escreva a
senao
escreva b
fimse
fimproc
14
15
16
17
18
19
20
f u n c i n t e i r o soma ( i n t e i r o a i n t e i r o b )
i n t e i r o a1 a2 a3 a4 a5
i n t e i r o b1 b2 b3 b4 b5
inicio
soma < a + b
fimfunc
21
22
23
24
25
26
p r o c proc soma ( r e f i n t e i r o c i n t e i r o a i n t e i r o b )
inicio
c < a + b
fimproc
27
28
29
30
31
f u n c l o g i c o maior ( i n t e i r o a i n t e i r o b )
inicio
maior < a > b
fimfunc
32
33
34
35
36
inicio
leia a
b < 7
37
38
39
proc soma ( c a b )
escreva c
40
41
e s c r e v a soma ( a b )
42
43
t e s t ( maior ( a b ) a b )
85
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
44
s e maior ( a b ) e n t a o
escreva 1
senao
escreva 0
fimse
45
46
47
48
49
50
51
fimprograma
C
odigo MVS correspondente:
1
2
3
4
L1
5
6
7
8
9
10
11
L2
12
13
14
L3
15
16
17
L4
18
19
20
21
22
23
24
25
L5
26
27
28
29
30
31
L6
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
L0
INPP
AMEM
DSVS
ENSP
AMEM
CRVL
DSVF
CRVL
ESCR
DSVS
NADA
CRVL
ESCR
NADA
DMEM
RTSP
ENSP
AMEM
CRVL
CRVL
SOMA
ARZL
DMEM
RTSP
ENSP
CRVL
CRVL
SOMA
ARMI
RTSP
ENSP
CRVL
CRVL
CMMA
ARZL
RTSP
NADA
LEIA
ARZG
CRCT
ARZG
CREG
CRVG
CRVG
SVCP
DSVS
6
L0
5
5
L2
4
L3
3
5
3
10
4
3
5
10
2
4
3
5
3
4
3
5
2
0
7
1
2
0
1
L5
86
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
L7
74
75
76
L8
77
78
6.4.10
1
2
3
4
5
6
7
8
9
CRVG
ESCR
AMEM
CRVG
CRVG
SVCP
DSVS
ESCR
AMEM
CRVG
CRVG
SVCP
DSVS
CRVG
CRVG
SVCP
DSVS
AMEM
CRVG
CRVG
SVCP
DSVS
DSVF
CRCT
ESCR
DSVS
NADA
CRCT
ESCR
NADA
DMEM
FIMP
2
1
0
1
L4
1
0
1
L6
0
1
L1
1
0
1
L6
L7
1
L8
0
Teste 10 - Simples
C
odigo MVS correspondente:
1
2
3
4
5
6
7
8
L1
INPP
DSVS
ENSP
CRVL
CRVL
SOMA
ARZL
RTSP
L0
4
3
5
2
87
CAPITULO 6. PROJETO - ROTINAS E PASSAGEM DE PARAMETRO
9
10
11
12
13
14
15
16
17
18
19
20
21
22
L0
NADA
AMEM
CRCT
CRCT
SVCP
DSVS
ESCR
AMEM
CRCT
CRCT
SVCP
DSVS
ESCR
FIMP
1
10
20
L1
1
5
100
L1
88