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 3647, Sat Nov 26 16:48:51 2011 UTC revision 4136, Sun Sep 27 02:33:39 2015 UTC
# Line 214  Line 214 
214    
215  structure LexGen: LEXGEN =  structure LexGen: LEXGEN =
216     struct     struct
217     open Array List     val sub = Array.sub
218     infix 9 sub     infix 9 sub
219    
220     datatype token = CHARS of bool array | QMARK | STAR | PLUS | BAR     datatype token = CHARS of bool array | QMARK | STAR | PLUS | BAR
# Line 458  Line 458 
458                    end                    end
459              (* end case *))              (* end case *))
460    
461        and onechar x = let val c = array(!CharSetSize, false)        and onechar x = let val c = Array.array(!CharSetSize, false)
462                in                in
463                  update(c, Char.ord(x), true); CHARS(c)                  Array.update(c, Char.ord(x), true); CHARS(c)
464                end                end
465    
466        in case !LexState of 0 => let val makeTok = fn () =>        in case !LexState of 0 => let val makeTok = fn () =>
# Line 528  Line 528 
528                  | #"$" => DOLLAR                  | #"$" => DOLLAR
529                  | #"/" => SLASH                  | #"/" => SLASH
530                  | #";" => SEMI                  | #";" => SEMI
531                  | #"." => let val c = array(!CharSetSize,true) in                  | #"." => let val c = Array.array(!CharSetSize,true) in
532                                  update(c,10,false); CHARS(c)                                  Array.update(c,10,false); CHARS(c)
533                          end                          end
534                          (* assign and arrow *)                          (* assign and arrow *)
535                  | #"=" => let val c = nextch() in                  | #"=" => let val c = nextch() in
# Line 541  Line 541 
541                                  end;                                  end;
542                          val first = classch();                          val first = classch();
543                          val flag = (first <> #"^");                          val flag = (first <> #"^");
544                          val c = array(!CharSetSize,not flag);                          val c = Array.array(!CharSetSize,not flag);
545                          fun add NONE = ()                          fun add NONE = ()
546                            | add (SOME x) = update(c, Char.ord(x), flag)                            | add (SOME x) = Array.update(c, Char.ord(x), flag)
547                          and range (x, y) = if x>y                          and range (x, y) = if x>y
548                                then (prErr "bad char. range")                                then (prErr "bad char. range")
549                                else let                                else let
# Line 660  Line 660 
660                  handle LOOKUP => prErr ("bad regular expression name: "^                  handle LOOKUP => prErr ("bad regular expression name: "^
661                                              name)                                              name)
662    
663          and newline = fn () => let val c = array(!CharSetSize,false) in          and newline = fn () => let val c = Array.array(!CharSetSize,false) in
664                  update(c,10,true); c                  Array.update(c,10,true); c
665                  end                  end
666    
667          and endline = fn e => trail(e,CLASS(newline(),0))          and endline = fn e => trail(e,CLASS(newline(),0))
# Line 1086  Line 1086 
1086      end      end
1087    
1088  fun leafdata(e:(int list * exp) list) =  fun leafdata(e:(int list * exp) list) =
1089          let val fp = array(!LeafNum + 1,nil)          let val fp = Array.array(!LeafNum + 1,nil)
1090          and leaf = array(!LeafNum + 1,EPS)          and leaf = Array.array(!LeafNum + 1,EPS)
1091          and tcpairs = ref nil          and tcpairs = ref nil
1092          and trailmark = ref ~1;          and trailmark = ref ~1;
1093          val rec add = fn          val rec add = fn
1094                    (nil,x) => ()                    (nil,x) => ()
1095                  | (hd::tl,x) => (update(fp,hd,union(fp sub hd,x));                  | (hd::tl,x) => (Array.update(fp,hd,union(fp sub hd,x));
1096                          add(tl,x))                          add(tl,x))
1097          and moredata = fn          and moredata = fn
1098                    CLOSURE(e1) =>                    CLOSURE(e1) =>
# Line 1100  Line 1100 
1100                  | ALT(e1,e2) => (moredata(e1); moredata(e2))                  | ALT(e1,e2) => (moredata(e1); moredata(e2))
1101                  | CAT(e1,e2) => (moredata(e1); moredata(e2);                  | CAT(e1,e2) => (moredata(e1); moredata(e2);
1102                          add(lastpos(e1),firstpos(e2)))                          add(lastpos(e1),firstpos(e2)))
1103                  | CLASS(x,i) => update(leaf,i,CLASS(x,i))                  | CLASS(x,i) => Array.update(leaf,i,CLASS(x,i))
1104                  | TRAIL(i) => (update(leaf,i,TRAIL(i)); if !trailmark = ~1                  | TRAIL(i) => (Array.update(leaf,i,TRAIL(i)); if !trailmark = ~1
1105                          then trailmark := i else ())                          then trailmark := i else ())
1106                  | END(i) => (update(leaf,i,END(i)); if !trailmark <> ~1                  | END(i) => (Array.update(leaf,i,END(i)); if !trailmark <> ~1
1107                          then (tcpairs := (!trailmark,i)::(!tcpairs);                          then (tcpairs := (!trailmark,i)::(!tcpairs);
1108                          trailmark := ~1) else ())                          trailmark := ~1) else ())
1109                  | _ => ()                  | _ => ()
# Line 1189  Line 1189 
1189       end       end
1190    
1191  and startstates() =  and startstates() =
1192          let val startarray = array(!StateNum + 1, nil);          let val startarray = Array.array(!StateNum + 1, nil);
1193              fun listofarray(a,n) =              fun listofarray(a,n) =
1194                  let fun f i l = if i >= 0 then  f (i-1) ((a sub i)::l) else l                  let fun f i l = if i >= 0 then  f (i-1) ((a sub i)::l) else l
1195                  in f (n-1) nil end                  in f (n-1) nil end
# Line 1198  Line 1198 
1198                  | (startlist,e)::tl => (fix(startlist,firstpos(e));makess(tl))                  | (startlist,e)::tl => (fix(startlist,firstpos(e));makess(tl))
1199          and fix = fn          and fix = fn
1200                    (nil,_) => ()                    (nil,_) => ()
1201                  | (s::tl,firsts) => (update(startarray,s,                  | (s::tl,firsts) => (Array.update(startarray,s,
1202                          union(firsts,startarray sub s));                          union(firsts,startarray sub s));
1203                          fix(tl,firsts))                          fix(tl,firsts))
1204          in makess(rules);listofarray(startarray, !StateNum + 1)          in makess(rules);listofarray(startarray, !StateNum + 1)

Legend:
Removed from v.3647  
changed lines
  Added in v.4136

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