All pastes #992246 Raw Edit

Meins

public text v1 · immutable
#992246 ·published 2008-04-21 18:20 UTC
rendered paste body
indexing

	title:       "Parser-Interpreter";
	cluster:     "Inf_3_Aufgabe_1";
	project:     "Inf_3_Aufgabe_1";
	copyright:   "";
	author:      "Silviya Marinska";
	original:    "";
	version:     "$Revision: 1.1 $";
	last_change: "$Date: 2005/02/01 11:46:51 $";
	done_at:     "";

class MAIN

inherit EXCEPTIONS

create

make

feature {NONE}-- Creation

	make (args : ARRAY [STRING]) is
		do
			-- Startup code...
		end -- make

feature

-- stringLenght : INTEGER is 60 -- Queries
endOfInput : BOOLEAN
i: INTEGER
readInput : STRING
symbol : CHARACTER
error : STRING is "Es ist Fehler aufgetreten"
a,b,c,d : REAL


Interpret :REAL is
--Initilize
local
--done : BOOLEAN

do
endOfInput := false
i := -1;
ReadNextSymbol
if not endOfInput then
result := ReadExpression();
--CheckSuccess
end

--rescue
--	done:= true
--if developer_exception then
--message := developer_exeption_name;
--end
end

ReadNextSymbol is

do
	i := i+1
if i > ReadInput.count
then endOfInput := true
--factorStr
	else symbol := ReadInput.item(i)
	end
end -- readnextsymbol




CheckSucces(condition:BOOLEAN;errormessage:STRING) is

do
	if not condition then raise(errormessage)
end
end -- checksucces



	Value(left : REAL; operation :CHARACTER; right : REAL) : REAL is
	do
	if operation = '+' then
	result := left+right

	elseif operation = '-' then
	result := left-right

	elseif operation = '*' then
	result := left*right

	elseif operation = '/' then
	--CheckSuccess(right /= 0, "Division by 0")
	result := left/right
	end
	end




ReadExpression : REAL is
--[Add op] Term {Add Op Term}
--Add Op = "+"|"-".

	local
	negative : BOOLEAN
	addOp : CHARACTER

	do
	negative := false
	if symbol = '-' THEN
	negative := symbol = '-'
	ReadNextSymbol

	else
	end
	result := ReadTerm()
	if negative then result := -result
	END
	from result:=result
	until endOfInput or symbol/='+' AND symbol/='-'
	loop addOp:= symbol
	ReadNextSymbol
	--checkSuccess(endOfInput = false, factorStr)
	result := Value(Result,addOp,ReadTerm())
	end
	end




	ReadTerm : REAL is
	-- Term = Factor {Mul Op Factor}
	--Mul Op = "*"|"/"
	local
		term : REAL
		mulOp : CHARACTER

		do
			term := ReadFactor
			result := term


		from
			result := term
			--(endOfInput := false)and (symbol = "*") or (symbol = "/")
		until
			endOfInput  or (symbol /= '*') and (symbol /= '/')
		loop
		mulOp := symbol
		ReadNextSymbol
		--CheckSuccess(endOfInput = false, factorStr)
		end
		result := Value(term, mulOp, ReadFactor());
	 end
	 



	ReadFactor : REAL is
		--Factor = Ident| "(" Expr ")".
	do

	if (symbol>='a' AND symbol <= 'z') then
	result := ReadIdent()
	elseif
	symbol = '(' then
	ReadNextSymbol
	--CheckSuccess(endOfInput := false, ""+", "-" or" + factorStr )
	result := ReadExpression
	--CheckSuccess
	ReadNextSymbol
	else
		--CheckSuccess(false, factorStr)
	end
	end



ReadIdent : REAL is
--Ident= "a"|"b"|"c"|"d".

	local
	
	--ident : REAL
	do

inspect symbol
when 'a' then
	result:=a
	ReadNextSymbol;
when 'b' then
	result:=b
	ReadNextSymbol;
when 'c' then
	result:=c
	ReadNextSymbol;
when 'd' then
	result:=d
	ReadNextSymbol;
	else
		--CheckSuccess (false, "Unknown variable" symbol.out);
	end
	end





end