ref: 5602844b7d3261133acdbf16462d91177338850f
parent: 4df17d13933cf5d70cedfc62eee17f52fbaf08d5
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Jun 30 14:34:38 EDT 2012
Fix up grammar to only accept valider patterns.
We don't try to match arbitrary fucking expressions now.
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -123,12 +123,12 @@
%type <tydef> tydef
-%type <node> exprln retexpr expr atomicexpr literal asnexpr lorexpr landexpr borexpr
-%type <node> bandexpr cmpexpr unioncons addexpr mulexpr shiftexpr prefixexpr postfixexpr
+%type <node> exprln retexpr expr atomicexpr littok literal asnexpr lorexpr landexpr borexpr
+%type <node> bandexpr cmpexpr unionexpr addexpr mulexpr shiftexpr prefixexpr postfixexpr
%type <node> funclit arraylit name block blockbody stmt label use
%type <node> decl declbody declcore structelt
%type <node> ifstmt forstmt whilestmt matchstmt elifs optexprln
-%type <node> pat match
+%type <node> pat unionpat match
%type <node> castexpr
%type <ucon> unionelt
@@ -394,16 +394,16 @@
| castexpr
;
-castexpr: unioncons Tcast Toparen type Tcparen
+castexpr: unionexpr Tcast Toparen type Tcparen
{$$ = mkexpr($1->line, Ocast, $1, NULL);$$->expr.type = $4;}
- | unioncons
+ | unionexpr
;
cmpop : Teq | Tgt | Tlt | Tge | Tle | Tne ;
-unioncons
+unionexpr
: Ttick Tident borexpr
{$$ = mkexpr($1->line, Ocons, mkname($2->line, $2->str), $3, NULL);}| Ttick Tident
@@ -493,7 +493,10 @@
literal : funclit {$$ = $1;} | arraylit {$$ = $1;}- | Tstrlit {$$ = mkstr($1->line, $1->str);}+ | littok {$$ = $1;}+ ;
+
+littok : Tstrlit {$$ = mkstr($1->line, $1->str);} | Tintlit {$$ = mkint($1->line, strtol($1->str, NULL, 0));} | Tchrlit {$$ = mkchar($1->line, *$1->str);} /* FIXME: expand escapes, unicode */ | Tfloatlit {$$ = mkfloat($1->line, strtod($1->str, NULL));}@@ -577,8 +580,15 @@
| Tendln {$$ = NULL;};
-pat : literal {$$ = mkexpr($1->line, Olit, $1, NULL);}- | unioncons {$$ = $1;}+pat : unionpat {$$ = $1;}+ | littok {$$ = mkexpr($1->line, Olit, $1, NULL);}+ | Tident {$$ = mkexpr($1->line, Ovar, mkname($1->line, $1->str), NULL);}+ ;
+
+unionpat: Ttick Tident pat
+ {$$ = mkexpr($1->line, Ocons, mkname($2->line, $2->str), $3, NULL);}+ | Ttick Tident
+ {$$ = mkexpr($1->line, Ocons, mkname($2->line, $2->str), NULL);};
block : blockbody Tendblk
--
⑨