open CalcLex.Internal; open CalcLex.UserDeclarations; datatype opNode = OP of result; datatype synTree = Empty | EXP of synTree * synTree | EXP1 of opNode * synTree | TERM of synTree * synTree | TERM1 of opNode * synTree | FACTOR of result; fun exp tokenList = let val (termTree, rest1) = term tokenList in let val (exp1Tree, rest) = exp1 rest1 in (EXP(termTree, exp1Tree), rest) end end and exp1 (PLUS::more) = let val (expTree, rest) = exp more in (EXP1(OP(PLUS), expTree), rest) end | exp1 (SUB::more) = let val (expTree, rest) = exp more in (EXP1(OP(SUB), expTree), rest) end | exp1 rest = (Empty, rest) and term tokenlist = let val (factorTree, rest1) = factor tokenlist in let val (term1Tree, rest) = term1 rest1 in (TERM(factorTree, term1Tree), rest) end end and term1 (DIV::more) = let val (termTree, rest) = term more in (TERM1(OP(DIV), termTree), rest) end | term1 (TIMES::more) = let val (termTree, rest) = term more in (TERM1(OP(TIMES), termTree), rest) end | term1 rest = (Empty, rest) and factor (ID(s)::rest) = (FACTOR(ID(s)), rest) | factor (NUM(n)::rest) = (FACTOR(NUM(n)), rest) | factor (LPAREN::more) = let val (expTree, (RPAREN::rest)) = exp more in (expTree, rest) end; exception SYNTAX_ERROR of lexresult list; fun allTokens (lexer) = let val token = (lexer():lexresult) in if token=EOF then [EOF] else token::allTokens(lexer) end; fun parse () = parse1 [] and parse1 [] = let val infile = (TextIO.openIn("testfile")) in let val lexer = CalcLex.makeLexer(fn n => TextIO.inputLine infile ) in let val (parseTree, rest) = exp (allTokens(lexer)) in if rest=[ EOF ] then parseTree else raise SYNTAX_ERROR(rest) end end end;