O objetivo deste exercício é desenvolver um analisador léxico para uma subconjunto da linguagem de programação Pascal. Seu programa deve receber um arquivo contendo código-fonte em Pascal, analisar o conteúdo e contar a quantidade de tokens para cada um dos seguintes tipos:
KEYWORD | IDENTIFIER | NUMBER | OPERATOR | COMPOUND_OPERATOR | DELIMITER
Para um token t
, o type(t)
é:
type(t)
= KEYWORD
t
{"and","array","begin","div","do",
"else","end","function","goto","if","label","not","of","or",
"procedure","program","then","type","var","while","read","write"}
type(t)
= IDENTIFIER
t
{isAlphanumeric(t)
startsWithLetter(t)}
t
KEYWORD
type(t)
= NUMBER
t
type(t)
= OPERATOR
t
{+, -, *, /, <, >, =}
type(t)
= COMPOUND_OPERATOR
t
{:=, <=, >=, <>}
type(t)
= DELIMITER
t
{(, ), [, ], ;, :, ,, .}
type(t)
= COMMENTS
t
{startsWith(t, "(*")
endsWith(t, "*)")}
type(t)
= UNKNOWN
t
(KEYWORD
IDENTIFIER
NUMBER
OPERATOR
COMPOUND_OPERATOR
DELIMITER
COMMENTS)
Seu programa deverá receber como parâmetro um arquivo de texto o qual contenha um código-fonte em Pascal a ser analisado.
O seu programa deverá imprimir, via stdout
, a quantidade de tokens, para cada um dos
tipos apresentados na seção Preâmbulo, presentes no arquivo
recebido como parâmetro. O formato de saída deve ser exatamente como
mostrado no exemplo abaixo.
program olamundo(input,output);
begin
write(42)
end.
KEYWORD: 4
IDENTIFIER: 3
NUMBER: 1
OPERATOR: 0
COMPOUND OPERATOR: 0
DELIMITER: 7
COMMENTS: 0
UNKNOWN: 0
program exemplo5 (input, output);
var n, k : integer;
f1, f2, f3 : integer;
begin
read (n);
f1:=0; f2:=1; k:=1;
while k<=n do
begin
f3:=f1+f2;
f1:=f2;
f2:=f3;
k:=k+1
end;
write (n, f1)
end.
KEYWORD: 10
IDENTIFIER: 27
NUMBER: 4
OPERATOR: 2
COMPOUND OPERATOR: 8
DELIMITER: 25
COMMENTS: 0
UNKNOWN: 0
program teste (input, output);
var m, n, s : integer;
begin
read(m,n);
s:=0;
while m<=n do
begin
s:=s+m*m;
write (m);
write (s);
m:=m+1
end
end.
KEYWORD: 11
IDENTIFIER: 20
NUMBER: 2
OPERATOR: 3
COMPOUND OPERATOR: 4
DELIMITER: 21
COMMENTS: 0
UNKNOWN: 0
program AnalisadorLexicoTeste;
var
numero: integer;
texto: string;
begin
numero := 10;
texto := 'Ola, mundo!';
writeln("O numero e: ", numero);
if numero > 5 then
writeln("O numero e maior que 5.")
else
writeln('O numero e menor ou igual a 5.');
for numero := 1 to 5 do
writeln('Numero atual: ', numero);
repeat
writeln('Loop infinito');
until false;
end.
KEYWORD: 8
IDENTIFIER: 42
NUMBER: 6
OPERATOR: 1
COMPOUND OPERATOR: 3
DELIMITER: 30
COMMENTS: 0
UNKNOWN: 13
Author: Bruno Ribas, Bruno Ribeiro, Igor Penha e Leonardo Machado