X-Git-Url: http://git.joshuawise.com/snipe.git/blobdiff_plain/1144856ba9d6018d9922c6ede7e97779a0fe6373:/parse/l4.lex..5c79bb689ab446551bc7ec4497e6c9b75582837e:/parse/l5.lex diff --git a/parse/l4.lex b/parse/l5.lex similarity index 86% rename from parse/l4.lex rename to parse/l5.lex index b988c35..e10f8b7 100644 --- a/parse/l4.lex +++ b/parse/l5.lex @@ -1,4 +1,4 @@ -(* L4 Compiler +(* L5 Compiler * Lexer * Author: Kaustuv Chaudhuri * Modified: Frank Pfenning @@ -41,6 +41,22 @@ in Tokens.INTNUM (Word32Signed.ZERO, yyp, yyp + size yyt) ) | SOME n => Tokens.INTNUM (n,yyp,yyp + size yyt) end + fun hexnumber (yyt, yyp) = + let + val t = String.extract (yyt, 2, NONE) + val ext = ParseState.ext (yyp, yyp + size yyt) + val numOpt = StringCvt.scanString (Word32.scan StringCvt.HEX) t + handle Overflow => + ( ErrorMsg.error ext + ("integral constant `" ^ yyt ^ "' too large") ; + NONE ) + in + case numOpt + of NONE => ( ErrorMsg.error ext + ("cannot parse integral constant `" ^ yyt ^ "'"); + Tokens.INTNUM (Word32Signed.ZERO, yyp, yyp + size yyt) ) + | SOME n => Tokens.INTNUM (n,yyp,yyp + size yyt) + end fun eof () = ( if (!commentLevel > 0) @@ -51,12 +67,13 @@ in end %% -%header (functor L4LexFn(structure Tokens : L4_TOKENS)); +%header (functor L5LexFn(structure Tokens : L5_TOKENS)); %full %s COMMENT COMMENT_LINE; id = [A-Za-z_][A-Za-z0-9_]*; decnum = [0-9][0-9]*; +hexnum = 0x[0-9a-fA-F][0-9a-fA-F]*; ws = [\ \t\012]; @@ -84,6 +101,9 @@ ws = [\ \t\012]; "^=" => (Tokens.BITXOREQ (yypos, yypos + size yytext)); "|=" => (Tokens.BITOREQ (yypos, yypos + size yytext)); + "++" => (Tokens.PLUSPLUS (yypos, yypos + size yytext)); + "--" => (Tokens.MINUSMINUS (yypos, yypos + size yytext)); + "+" => (Tokens.PLUS (yypos, yypos + size yytext)); "-" => (Tokens.MINUS (yypos, yypos + size yytext)); "!" => (Tokens.BANG (yypos, yypos + size yytext)); @@ -105,6 +125,7 @@ ws = [\ \t\012]; ">=" => (Tokens.GE (yypos, yypos + size yytext)); ">" => (Tokens.GT (yypos, yypos + size yytext)); + "?" => (Tokens.QUESTION (yypos, yypos + size yytext)); ":" => (Tokens.COLON (yypos, yypos + size yytext)); "," => (Tokens.COMMA (yypos, yypos + size yytext)); @@ -129,6 +150,7 @@ ws = [\ \t\012]; {decnum} => (number (yytext, yypos)); + {hexnum} => (hexnumber (yytext, yypos)); {id} => (let val id = Symbol.symbol yytext