diff options
| author | Graydon Hoare <[email protected]> | 2010-09-20 23:56:43 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-09-20 23:56:43 -0700 |
| commit | c5f4789d5b75d3098665b17d318144cb7c54f42a (patch) | |
| tree | 2d0ef3ef0e85aa7f2453d8bae762c89552a99ed9 /src/boot/fe | |
| parent | Wrap long lines. (diff) | |
| download | rust-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.ml | 40 | ||||
| -rw-r--r-- | src/boot/fe/lexer.mll | 1 | ||||
| -rw-r--r-- | src/boot/fe/token.ml | 2 |
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 -> "<-" |