Analisador Léxico: Pascal

Preâmbulo

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) é:

Entrada

Seu programa deverá receber como parâmetro um arquivo de texto o qual contenha um código-fonte em Pascal a ser analisado.

Saída

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.

Exemplos

Exemplo de entrada

program olamundo(input,output);
begin
  write(42)
end.

Saída para o exemplo acima

KEYWORD: 4
IDENTIFIER: 3
NUMBER: 1
OPERATOR: 0
COMPOUND OPERATOR: 0
DELIMITER: 7
COMMENTS: 0
UNKNOWN: 0

Exemplo de entrada

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.

Saída para o exemplo acima

KEYWORD: 10
IDENTIFIER: 27
NUMBER: 4
OPERATOR: 2
COMPOUND OPERATOR: 8
DELIMITER: 25
COMMENTS: 0
UNKNOWN: 0

Exemplo de entrada

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.

Saída para o exemplo acima

KEYWORD: 11
IDENTIFIER: 20
NUMBER: 2
OPERATOR: 3
COMPOUND OPERATOR: 4
DELIMITER: 21
COMMENTS: 0
UNKNOWN: 0

Exemplo de entrada


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.

Saída para o exemplo acima

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