-- Author: Christopher Waid
-- Course: CIS310 010
-- Assignment: #2
-- Due Date: June 15, 2007
-- Filename: lookup.adb
-- Purpose: looks up the enum_token
with Ada.Text_Io; use Ada;
package body LookUp is
procedure LookUpSymbol (Token : in String; Symbol : out Integer) is
-- Function name: LookUpSymbol
-- Description: create token
-- Parameters: String Token INPUT data input
-- Integer Symbol OUTPUT token number
-- Return Value: none
type Enum_Token_Type is
(ADDsym,BEGINsym,COLONsym,COMMAsym,DECsym,DIVIDEsym,ENDsym,
EQUALsym,IDsym,INTsym,LPARANsym,RPARANsym,MINUSsym,
MULTIPLYsym,PROGsym,READsym,SEMICOLONsym,WRITEsym,REALsym, INTLITsym, OTHERsym);
package Class_IO is new Ada.Text_IO.Enumeration_IO(Enum_Token_Type);
use Class_IO;
i : Integer :=1;
len_token : Integer :=1;
begin
while len_token < 35 and Token(len_token) /=' '
loop
len_token:=len_token+1;
end loop;
if (Token(1..4) = "END.") and (len_token = 5) then
Symbol := Enum_Token_Type'Pos(ENDsym);
return;
end if;
i:=1;
while i < 35
loop
if Token(i)='.' or
Token(i)='!'
then
Symbol := Enum_Token_Type'Pos(OTHERsym);
return;
end if;
Text_IO.Put(Token(i));
i:=i+1;
end loop;
Text_IO.New_Line;
i:=1;
--creat tokens
case Token(1) is -- this checks for numbers
when '0' .. '9' =>
while i < 35
loop
case Token(i) is
when '0'..'9' =>
null;
when 'a' .. 'z' =>
Symbol := Enum_Token_Type'Pos(OTHERsym);
return;
when 'A' ..'Z' =>
Symbol := Enum_Token_Type'Pos(OTHERsym);
return;
when others =>
null;
end case;
i:=i+1;
end loop;
Symbol := Enum_Token_Type'Pos(INTLITsym);
when others => -- this checks everything else
if Token(1) = ',' then
Symbol := Enum_Token_Type'Pos(COMMAsym);
elsif Token(1) = ':' then
Symbol := Enum_Token_Type'Pos(COLONsym);
elsif Token(1) = ';' then
Symbol := Enum_Token_Type'Pos(SEMICOLONsym);
elsif Token(1) = '(' then
Symbol := Enum_Token_Type'Pos(LPARANsym);
elsif Token(1) = ')' then
Symbol := Enum_Token_Type'Pos(RPARANsym);
elsif Token(1) = '*' then
Symbol := Enum_Token_Type'Pos(MULTIPLYsym);
elsif Token(1) = '+' then
Symbol := Enum_Token_Type'Pos(ADDsym);
elsif Token(1) = '=' then
Symbol := Enum_Token_Type'Pos(EQUALsym);
elsif Token(1..7) = "PROGRAM" then
Symbol := Enum_Token_Type'Pos(PROGsym);
elsif Token(1..5) = "BEGIN" then
Symbol := Enum_Token_Type'Pos(BEGINsym);
elsif Token(1..3) = "INT" then
Symbol := Enum_Token_Type'Pos(INTsym);
elsif Token(1..5) = "WRITE" then
Symbol := Enum_Token_Type'Pos(WRITEsym);
elsif Token(1..4) = "READ" then
Symbol := Enum_Token_Type'Pos(READsym);
elsif Token(1..3) = "DEC" then
Symbol := Enum_Token_Type'Pos(DECsym);
elsif Token(1..1) = "#" then
Symbol := Enum_Token_Type'Pos(OTHERsym);
elsif Token(1..1) = "@" then
Symbol := Enum_Token_Type'Pos(OTHERsym);
elsif Token(1..4) = "REAL" then
Symbol := Enum_Token_Type'Pos(REALsym);
else
Symbol := Enum_Token_Type'Pos(IDsym);
end if;
end case;
end LookUpSymbol;
end LookUp;