Compilador para a disciplina de Compiladores.
Abaixo estão as especificações para o analisador léxico:
Os identificadores são compostos por letras (maiúsculas ou minúsculas), números, e os caracteres _ (underscore) e @ (arroba). Eles devem iniciar necessariamente com uma letra. É crucial notar que eles não podem começar ou terminar com _ (underscore) ou @ (arroba). Além disso, se o identificador contiver o caractere @ (arroba), não pode conter o _ (underscore) simultaneamente.
Claro, aqui está a tabela com os exemplos de identificadores válidos e inválidos:
Identificadores Válidos | Identificadores Inválidos |
---|---|
i | 1xPeso |
jx | 24kg |
soma | _palavras |
k12aa3b | soma__peso |
z_teste | automato_ |
u_teste123a_b | @user |
u_12tes3 | case@uespi_olx |
s_o_mapesonota | numero@@dois |
somaPeso | teste@ |
K_PESO_TOTAL | numero@dois |
O analisador léxico deve ser capaz de reconhecer palavras reservadas, que têm significados específicos dentro da linguagem de programação.
principal |
if |
then |
else |
while |
do |
until |
repeat |
int |
double |
char |
case |
switch |
end |
procedure |
function |
for |
begin |
type |
var |
or |
div |
and |
O analisador léxico deve ser capaz de reconhecer uma variedade de símbolos e operadores essenciais na análise do código-fonte.
;
,
.
+
-
*
(
)
<
>
:
=
{
}
:=
<>
<=
>=
/
@
-=
Os comentários de uma linha devem começar com ! (ponto de exclamação) e os comentários de múltiplas linhas devem iniciar e finalizar com !! (dois pontos de exclamação).
- ! Esse é um comentário de uma linha!
- ! Outro comentário de uma linha.
- @@ Outro comentário de uma linha.
- !! Esse é um comentário de múltiplas linhas! Isso é importante na documentação de todas as linguagens de programação.!!
- // Outro comentário de múltiplas linhas! //
O analisador léxico deve identificar números inteiros (positivos ou negativos) compostos por uma ou mais dígitos, e também reconhecer números decimais (positivos ou negativos) formados por uma parte inteira seguida por uma vírgula e uma parte decimal.
1
12
−5
-54
1.5
254.8
-123.4
−12.55
Os autômatos são essenciais na análise e reconhecimento de padrões dentro do código-fonte, permitindo a identificação de tokens, como identificadores, palavras reservadas, símbolos especiais e números.
O analisador sintático é uma parte crucial de um compilador, responsável por interpretar a estrutura gramatical do código-fonte. Abaixo está a especificação do analisador sintático para esse compilador.
< e >
: não terminais{ }
: pode repetir[ ]
: opcional
<programa>
➝principal
<identificador>;
<bloco>
<bloco>
➝[<definicao de tipos>]
[<definicao de variaveis>]
[<definicao de sub-rotinas>]
<comando composto>
-
<definicao de tipos>
➝type
<identificador>
=
<tipo>
{;
<identificador>
=
<tipo>
};
-
<tipo>
➝<identificador>
|int
|boolean
|double
|char
-
<definicao de variaveis>
➝var
<lista de identificadores>
:
<tipo>
{;
<lista de identificadores>
:
<tipo>
};
-
<lista de identificadores>
➝<identificador>
{,
<identificador>
}
-
<definicao de sub-rotinas>
➝{<definicao de procedimento>; | <definição de funcao>;}
-
<definicao de procedimento>
➝procedure
<identificador>
[<parametros formais>]
;
<bloco>
-
<definição de funcao>
➝function
<identificador>
[<parametros formais>]
:
<identificador>
;
<bloco>
(*) 10. <parametros formais>
➝ (
<lista de identificadores>
:
<identificador>
{;
<lista de identificadores>
:
<identificador>
})
<comando composto>
➝begin
<comando sem rotulo>;
{<comando sem rotulo>;}
end
<comando sem rotulo>
➝<atribuicao>
|<chamada de procedimento>
|<comando condicional>
|<comando repetitivo>
<atribuicao>
➝<variavel> :=
<expressao>
<chamada de procedimento>
➝<identificador>
[
<lista de expressoes>
]
(**) 15. <comando condicional>
➝ if
<expressao>
then
<comando sem rotulo>
[
else
<comando sem rotulo>
]
(**) 16. <comando repetitivo>
➝ while
<expressao>
do
<comando sem rotulo>
OBS: Os comandos de entrada (read) e saída (print) estão incluídos nas chamadas de procedimentos
<lista de expressoes>
➝<expressao>
{,
<expressao>
}
<expressao>
➝<expressao simples>
[
<relacao>
<expressao simples>
]
<relacao>
➝=
|<>
|<
|<=
|>
|>=
<expressao simples>
➝[+ | -]
<termo>
{<operador1>
<termo>
}
<termo>
➝<fator>
{<operador2>
<fator>
}
<operador1>
➝+
|-
|or
<operador2>
➝*
|div
|and
<fator>
➝<variavel>
|<digito>
|<chamada de funcao>
|(
<expressao>
)
<variavel>
➝<identificador>
<chamada de funcao>
➝<identificador>
[
<lista de expressoes>
]
(*) sem passagem de parâmetro por referência
(**) apenas um tipo de comando condicional e repetitivo será especificado