All pastes #597995 Raw Edit

lookup.adb

public text v1 · immutable
#597995 ·published 2007-06-30 23:50 UTC
rendered paste body
--   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;