(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *)
(* drt (12/15/89) -- the functor should be used during development work, but it is wastes space in the release version. functor ParserGen(structure LrTable : LR_TABLE structure Stream : STREAM) : LR_PARSER =
*)
fun printStack(stack: ('a,'b) elem list, n: int) = case stack of (state, _) :: rest =>
(print(" " ^ makestring n ^ ": ");
println(showState state);
printStack(rest, n+1)
)
| nil => ()
val parse = fn {arg : 'a,
table : LrTable.table,
lexer : ('_b,'_c) token Stream.stream,
saction : int * '_c * ('_b,'_c) stack * 'a ->
nonterm * ('_b * '_c * '_c) * ('_b,'_c) stack,
void : '_b,
ec = {is_keyword,preferred_change,
errtermvalue,showTerminal,
error,terms,noShift},
lookahead} => letfun prAction(stack as (state, _) :: _,
next as (TOKEN (term,_),_), action) =
(println "Parse: state stack:";
printStack(stack, 0); print(" state="
^ showState state
^ " next="
^ showTerminal term
^ " action="
); case action of SHIFT s => println ("SHIFT " ^ showState s)
| REDUCE i => println ("REDUCE " ^ (makestring i))
| ERROR => println "ERROR"
| ACCEPT => println "ACCEPT";
action)
| prAction (_,_,action) = action
val action = LrTable.action table val goto = LrTable.goto table
fun parseStep(next as (TOKEN (terminal, value as (_,leftPos,_)),lexer) :
('_b,'_c) token * ('_b,'_c) token Stream.stream,
stack as (state,_) :: _ : ('_b ,'_c) stack) = case (if DEBUG then prAction(stack, next,action(state, terminal)) else action(state, terminal)) of SHIFT s => parseStep(Stream.get lexer, (s,value) :: stack)
| REDUCE i => letval (nonterm,value,stack as (state,_) :: _ ) =
saction(i,leftPos,stack,arg) in parseStep(next,(goto(state,nonterm),value)::stack) end
| ERROR => letval (_,leftPos,rightPos) = value in error("syntax error\n",leftPos,rightPos); raise ParseError end
| ACCEPT => letval (_,(topvalue,_,_)) :: _ = stack val (token,restLexer) = next in (topvalue,Stream.cons(token,lexer)) end val next as (TOKEN (terminal,(_,leftPos,_)),_) = Stream.get lexer in parseStep(next,[(initialState table,(void,leftPos,leftPos))]) end end;
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.