|
|
1.1 ! root 1: open C.LexValue ! 2: type lexresult=V ! 3: val eof = fn () => EOF ! 4: val lineno = C.G.lineno ! 5: ! 6: structure KeyWord : sig ! 7: val find : string -> V option ! 8: end = ! 9: struct ! 10: ! 11: val TableSize = 211 ! 12: val HashFactor = 5 ! 13: ! 14: val hash = fn s => ! 15: fold (fn (c,v)=>(v*HashFactor+(ord c)) mod TableSize) (explode s) 0 ! 16: ! 17: ! 18: val HashTable = array(TableSize,nil) : (string * V) list array ! 19: ! 20: ! 21: val add = fn (s,v) => ! 22: let val i = hash s ! 23: in update(HashTable,i,(s,v) :: (HashTable sub i)) ! 24: end ! 25: ! 26: val find = fn s => ! 27: let val i = hash s ! 28: fun f ((key,v)::r) = if s=key then SOME v else f r ! 29: | f nil = NONE ! 30: in f (HashTable sub i) ! 31: end ! 32: ! 33: val _ = ! 34: (List.app add ! 35: [("and",YAND), ! 36: ("array",YARRAY), ! 37: ("begin",YBEGIN), ! 38: ("case",YCASE), ! 39: ("const",YCONST), ! 40: ("div",YDIV), ! 41: ("do",YDO), ! 42: ("downto",YDOWNTO), ! 43: ("else",YELSE), ! 44: ("end",YEND), ! 45: ("extern",YEXTERN), ! 46: ("file",YFILE), ! 47: ("for",YFOR), ! 48: ("forward",YFORWARD), ! 49: ("function",YFUNCTION), ! 50: ("goto",YGOTO), ! 51: ("hex",YHEX), ! 52: ("if",YIF), ! 53: ("in",YIN), ! 54: ("label",YLABEL), ! 55: ("mod",YMOD), ! 56: ("nil",YNIL), ! 57: ("not",YNOT), ! 58: ("oct",YOCT), ! 59: ("of",YOF), ! 60: ("or",YOR), ! 61: ("packed",YPACKED), ! 62: ("procedure",YPROCEDURE), ! 63: ("program",YPROG), ! 64: ("record",YRECORD), ! 65: ("repeat",YREPEAT), ! 66: ("set",YSET), ! 67: ("then",YTHEN), ! 68: ("to",YTO), ! 69: ("type",YTYPE), ! 70: ("until",YUNTIL), ! 71: ("var",YVAR), ! 72: ("while",YWHILE), ! 73: ("with",YWITH) ! 74: ]) ! 75: end ! 76: open KeyWord ! 77: ! 78: %% ! 79: ! 80: %s C B; ! 81: alpha=[A-Za-z]; ! 82: digit=[0-9]; ! 83: optsign=("+"|"-")?; ! 84: integer={digit}+; ! 85: frac="."{digit}+; ! 86: exp=(e|E){optsign}{digit}+; ! 87: octdigit=[0-7]; ! 88: ws = [\ \t]; ! 89: %% ! 90: <INITIAL>{ws}+ => (lex()); ! 91: <INITIAL>\n => (inc lineno; lex()); ! 92: <INITIAL>{alpha}+ => (case find yytext of SOME v => v | _ => YID); ! 93: <INITIAL>{alpha}({alpha}|{digit})* => (YID); ! 94: <INITIAL>{optsign}{integer}({frac}{exp}?|{frac}?{exp}) => (YNUMB); ! 95: <INITIAL>{optsign}{integer} => (YINT); ! 96: <INITIAL>{octdigit}+(b|B) => (YBINT); ! 97: <INITIAL>"'"([^']|"''")*"'" => (YSTRING); ! 98: <INITIAL>"(*" => (YYBEGIN C; lex()); ! 99: <INITIAL>".." => (YDOTDOT); ! 100: <INITIAL>"." => (YDOT); ! 101: <INITIAL>"(" => (YLPAR); ! 102: <INITIAL>")" => (YRPAR); ! 103: <INITIAL>";" => (YSEMI); ! 104: <INITIAL>"," => (YCOMMA); ! 105: <INITIAL>":" => (YCOLON); ! 106: <INITIAL>"^" => (YCARET); ! 107: <INITIAL>"[" => (YLBRA); ! 108: <INITIAL>"]" => (YRBRA); ! 109: <INITIAL>"~" => (YTILDE); ! 110: <INITIAL>"<" => (YLESS); ! 111: <INITIAL>"=" => (YEQUAL); ! 112: <INITIAL>">" => (YGREATER); ! 113: <INITIAL>"+" => (YPLUS); ! 114: <INITIAL>"-" => (YMINUS); ! 115: <INITIAL>"|" => (YBAR); ! 116: <INITIAL>"*" => (YSTAR); ! 117: <INITIAL>"/" => (YSLASH); ! 118: <INITIAL>"{" => (YYBEGIN B; lex()); ! 119: <INITIAL>. => (YILLCH); ! 120: <C>\n => (inc lineno; lex()); ! 121: <C>[^()*\n]+ => (lex()); ! 122: <C>"(*" => (lex()); ! 123: <C>"*)" => (YYBEGIN INITIAL; lex()); ! 124: <C>[*()] => (lex()); ! 125: <B>\n => (inc lineno; lex()); ! 126: <B>[^{}\n]+ => (lex()); ! 127: <B>"{" => (lex()); ! 128: <B>"}" => (YYBEGIN INITIAL; lex());
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.