aboutsummaryrefslogtreecommitdiff
path: root/src/boot/fe
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-09-20 23:56:43 -0700
committerGraydon Hoare <[email protected]>2010-09-20 23:56:43 -0700
commitc5f4789d5b75d3098665b17d318144cb7c54f42a (patch)
tree2d0ef3ef0e85aa7f2453d8bae762c89552a99ed9 /src/boot/fe
parentWrap long lines. (diff)
downloadrust-c5f4789d5b75d3098665b17d318144cb7c54f42a.tar.xz
rust-c5f4789d5b75d3098665b17d318144cb7c54f42a.zip
Bind pattern slots with ?, drop parens from 0-ary tag constructors, translate 0-ary constructors as constants. Rustc loses ~300kb.
Diffstat (limited to 'src/boot/fe')
-rw-r--r--src/boot/fe/item.ml40
-rw-r--r--src/boot/fe/lexer.mll1
-rw-r--r--src/boot/fe/token.ml2
3 files changed, 30 insertions, 13 deletions
diff --git a/src/boot/fe/item.ml b/src/boot/fe/item.ml
index c747713b..4173eb53 100644
--- a/src/boot/fe/item.ml
+++ b/src/boot/fe/item.ml
@@ -255,12 +255,11 @@ and parse_stmts (ps:pstate) : Ast.stmt array =
bump ps;
let rec parse_pat ps =
match peek ps with
- IDENT _ ->
+ QUES ->
let apos = lexpos ps in
- let name = Pexp.parse_name ps in
- let bpos = lexpos ps in
-
- if peek ps != LPAREN then
+ bump ps;
+ let name = Pexp.parse_name ps in
+ let bpos = lexpos ps in
begin
match name with
Ast.NAME_base (Ast.BASE_ident ident) ->
@@ -273,11 +272,19 @@ and parse_stmts (ps:pstate) : Ast.stmt array =
ident))
|_ -> raise (unexpected ps)
end
- else
- let lv = name_to_lval apos bpos name in
- let parse_pat ps = either_get_left (parse_pat ps) in
- Left
- (Ast.PAT_tag (lv, paren_comma_list parse_pat ps))
+
+ | IDENT _ ->
+ let apos = lexpos ps in
+ let name = Pexp.parse_name ps in
+ let bpos = lexpos ps in
+ let lv = name_to_lval apos bpos name in
+ let parse_pat ps = either_get_left (parse_pat ps) in
+ let args =
+ match peek ps with
+ LPAREN -> paren_comma_list parse_pat ps
+ | _ -> [| |]
+ in
+ Left (Ast.PAT_tag (lv, args))
| LIT_INT _
| LIT_UINT _
@@ -874,9 +881,16 @@ and parse_tag_item
incr j;
((span ps apos bpos s), "_" ^ string_of_int (!j))
in
- let res = match peek ps with
- LPAREN -> paren_comma_list parse_ctor_slot ps
- | _ -> raise (err "tag variant missing argument list" ps)
+ let res =
+ match peek ps with
+ LPAREN ->
+ let slots = paren_comma_list parse_ctor_slot ps in
+ if Array.length slots = 0
+ then
+ raise (err ("empty argument list to tag constructor") ps)
+ else slots
+
+ | _ -> [| |]
in
expect ps SEMI;
res
diff --git a/src/boot/fe/lexer.mll b/src/boot/fe/lexer.mll
index 58b27ec1..763b50c9 100644
--- a/src/boot/fe/lexer.mll
+++ b/src/boot/fe/lexer.mll
@@ -244,6 +244,7 @@ rule token = parse
| ',' { COMMA }
| ';' { SEMI }
| ':' { COLON }
+| '?' { QUES }
| "<-" { LARROW }
| "<|" { SEND }
| "->" { RARROW }
diff --git a/src/boot/fe/token.ml b/src/boot/fe/token.ml
index e6f8cd4b..85dd2a13 100644
--- a/src/boot/fe/token.ml
+++ b/src/boot/fe/token.ml
@@ -33,6 +33,7 @@ type token =
| COMMA
| SEMI
| COLON
+ | QUES
| RARROW
| SEND
| LARROW
@@ -187,6 +188,7 @@ let rec string_of_tok t =
| COMMA -> ","
| SEMI -> ";"
| COLON -> ":"
+ | QUES -> "?"
| RARROW -> "->"
| SEND -> "<|"
| LARROW -> "<-"