Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /ml-lex/trunk/lexgen.sml
ViewVC logotype

Diff of /ml-lex/trunk/lexgen.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 651, Thu Jun 1 18:34:03 2000 UTC revision 1350, Fri Sep 5 21:34:27 2003 UTC
# Line 45  Line 45 
45                  and characters.                  and characters.
46          02/08/95 (jhr) Modified to use new List module interface.          02/08/95 (jhr) Modified to use new List module interface.
47          05/18/95 (jhr) changed Vector.vector to Vector.fromList          05/18/95 (jhr) changed Vector.vector to Vector.fromList
48  *  
  * $Log: lexgen.sml,v $  
  * Revision 1.1.1.1  1998/04/08 18:40:10  george  
  * Version 110.5  
  *  
49   * Revision 1.9  1998/01/06 19:23:53  appel   * Revision 1.9  1998/01/06 19:23:53  appel
50   *   added %posarg feature to permit position-within-file to be passed   *   added %posarg feature to permit position-within-file to be passed
51   *   as a parameter to makeLexer   *   as a parameter to makeLexer
# Line 72  Line 68 
68  # Revision 1.3  1997/10/04  03:52:13  dbm  # Revision 1.3  1997/10/04  03:52:13  dbm
69  #   Fix to remove output file if ml-lex fails.  #   Fix to remove output file if ml-lex fails.
70  #  #
71  # Revision 1.2  1997/05/06  01:12:38  george          10/17/02 (jhr) changed bad character error message to properly
72  # *** empty log message ***                  print the bad character.
73  #          10/17/02 (jhr) fixed skipws to use Char.isSpace test.
  * Revision 1.2  1996/02/26  15:02:27  george  
  *    print no longer overloaded.  
  *    use of makestring has been removed and replaced with Int.toString ..  
  *    use of IO replaced with TextIO  
  *  
  * Revision 1.1.1.1  1996/01/31  16:01:15  george  
  * Version 109  
  *  
74   *)   *)
75    
76  (* Subject: lookahead in sml-lex  (* Subject: lookahead in sml-lex
# Line 436  Line 424 
424                num (explode s, 0)                num (explode s, 0)
425              end              end
426    
427        fun skipws () = (case nextch()        fun skipws () = let val ch = nextch()
428               of #" " => skipws()              in
429                | #"\t" => skipws()                if Char.isSpace ch
430                | #"\n" => skipws()                  then skipws()
431                | x => x                  else ch
432              (* end case *))              end
433    
434        and nextch () = getch(!LexBuf)        and nextch () = getch(!LexBuf)
435    
# Line 513  Line 501 
501                               end                               end
502                          in ID(getID [ch])                          in ID(getID [ch])
503                          end                          end
504                        else (prSynErr ("bad character: " ^ String.str ch))                        else prSynErr (String.concat[
505                              "bad character: \"", Char.toString ch, "\""
506                            ])
507          in NextTok := makeTok()          in NextTok := makeTok()
508          end          end
509          | 1 => let val rec makeTok = fn () =>          | 1 => let val rec makeTok = fn () =>
# Line 619  Line 609 
609          in NextTok := makeTok()          in NextTok := makeTok()
610          end          end
611          | 2 => NextTok :=          | 2 => NextTok :=
612               (case skipws()                 (case skipws() of
613                   of #"(" => let                    #"(" =>
614                          fun GetAct (lpct,x) = (case getch(!LexBuf)                    let
615                                 of #"(" => GetAct (lpct+1, #"("::x)                      fun loop_to_end (backslash, x) =
616                                  | #")" => if lpct = 0 then (implode (rev x))                        let
617                                                        else GetAct(lpct-1, #")"::x)                          val c    = getch (! LexBuf)
618                                  | y => GetAct(lpct,y::x)                          val notb = not backslash
619                                (* end case *))                          val nstr = c :: x
620                          in ACTION (GetAct (0,nil))                        in
621                            case c of
622                              #"\"" => if notb then nstr
623                                       else loop_to_end (false, nstr)
624                            | _ => loop_to_end (c = #"\\" andalso notb, nstr)
625                          end
626                        fun GetAct (lpct, x) =
627                          let
628                            val c    = getch (! LexBuf)
629                            val nstr = c :: x
630                          in
631                            case c of
632                              #"\"" => GetAct (lpct, loop_to_end (false, nstr))
633                            | #"(" => GetAct (lpct + 1, nstr)
634                            | #")" => if lpct = 0 then implode (rev x)
635                                      else GetAct(lpct - 1, nstr)
636                            | _ => GetAct(lpct, nstr)
637                          end
638                      in
639                        ACTION (GetAct (0,nil))
640                          end                          end
641                   | #";" => SEMI                   | #";" => SEMI
642                   | c => (prSynErr ("invalid character " ^ String.str c)))                   | c => (prSynErr ("invalid character " ^ String.str c)))
# Line 1241  Line 1250 
1250           sayln "\t\t\t(let fun yymktext() = substring(!yyb,i0,i-i0)\n\           sayln "\t\t\t(let fun yymktext() = substring(!yyb,i0,i-i0)\n\
1251                 \\t\t\t     val yypos = i0+ !yygone";                 \\t\t\t     val yypos = i0+ !yygone";
1252           if !CountNewLines           if !CountNewLines
1253              then (sayln "\t\t\tval _ = yylineno := CharVector.foldli";              then (sayln "\t\t\tval _ = yylineno := CharVectorSlice.foldli";
1254                    sayln "\t\t\t\t(fn (_,#\"\\n\", n) => n+1 | (_,_, n) => n) (!yylineno) (!yyb,i0,SOME(i-i0))")                    sayln "\t\t\t\t(fn (_,#\"\\n\", n) => n+1 | (_,_, n) => n) (!yylineno) (CharVectorSlice.slice (!yyb,i0,SOME(i-i0)))")
1255              else ();              else ();
1256           if !HaveReject           if !HaveReject
1257               then (say "\t\t\tfun REJECT() = action(i,acts::l";               then (say "\t\t\tfun REJECT() = action(i,acts::l";

Legend:
Removed from v.651  
changed lines
  Added in v.1350

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0