Просмотр исходного кода

[parser] allow parsing `macro.field`

closes #7210
Simon Krajewski 7 лет назад
Родитель
Сommit
50d472fe2b

+ 21 - 14
src/syntax/grammar.mly

@@ -1099,7 +1099,11 @@ and expr = parser
 	| [< '(Kwd k,p) when !parsing_macro_cond; s >] ->
 		expr_next (EConst (Ident (s_keyword k)), p) s
 	| [< '(Kwd Macro,p); s >] ->
-		parse_macro_expr p s
+		begin match s with parser
+		| [< '(Dot,pd); e = parse_field (EConst (Ident "macro"),p) pd >] -> e
+		| [< e = parse_macro_expr p >] -> e
+		| [< >] -> serror()
+		end
 	| [< '(Kwd Var,p1); v = parse_var_decl >] -> (EVars [v],p1)
 	| [< '(Const c,p); s >] -> expr_next (EConst c,p) s
 	| [< '(Kwd This,p); s >] -> expr_next (EConst (Ident "this"),p) s
@@ -1215,19 +1219,7 @@ and expr_next' e1 = parser
 		(match fst e1 with
 		| EConst(Ident n) -> expr_next (EMeta((Meta.from_string n,[],snd e1),eparam), punion p1 p2) s
 		| _ -> assert false)
-	| [< '(Dot,p); s >] ->
-		check_resume p (fun () -> display (EDisplay (e1,DKDot),p)) (fun () -> ());
-		(match s with parser
-		| [< '(Kwd Macro,p2) when p.pmax = p2.pmin; s >] -> expr_next (EField (e1,"macro") , punion (pos e1) p2) s
-		| [< '(Kwd Extern,p2) when p.pmax = p2.pmin; s >] -> expr_next (EField (e1,"extern") , punion (pos e1) p2) s
-		| [< '(Kwd New,p2) when p.pmax = p2.pmin; s >] -> expr_next (EField (e1,"new") , punion (pos e1) p2) s
-		| [< '(Const (Ident f),p2) when p.pmax = p2.pmin; s >] -> expr_next (EField (e1,f) , punion (pos e1) p2) s
-		| [< '(Dollar v,p2); s >] -> expr_next (EField (e1,"$"^v) , punion (pos e1) p2) s
-		| [< >] ->
-			(* turn an integer followed by a dot into a float *)
-			match e1 with
-			| (EConst (Int v),p2) when p2.pmax = p.pmin -> expr_next (EConst (Float (v ^ ".")),punion p p2) s
-			| _ -> serror())
+	| [< '(Dot,p); e = parse_field e1 p >] -> e
 	| [< '(POpen,p1); e = parse_call_params (fun el p2 -> (ECall(e1,el)),punion (pos e1) p2) p1; s >] -> expr_next e s
 	| [< '(BkOpen,_); e2 = expr; '(BkClose,p2); s >] ->
 		expr_next (EArray (e1,e2), punion (pos e1) p2) s
@@ -1257,6 +1249,21 @@ and expr_next' e1 = parser
 		make_binop OpIn e1 e2
 	| [< >] -> e1
 
+and parse_field e1 p s =
+	check_resume p (fun () -> display (EDisplay (e1,DKDot),p)) (fun () -> ());
+	begin match s with parser
+	| [< '(Kwd Macro,p2) when p.pmax = p2.pmin; s >] -> expr_next (EField (e1,"macro") , punion (pos e1) p2) s
+	| [< '(Kwd Extern,p2) when p.pmax = p2.pmin; s >] -> expr_next (EField (e1,"extern") , punion (pos e1) p2) s
+	| [< '(Kwd New,p2) when p.pmax = p2.pmin; s >] -> expr_next (EField (e1,"new") , punion (pos e1) p2) s
+	| [< '(Const (Ident f),p2) when p.pmax = p2.pmin; s >] -> expr_next (EField (e1,f) , punion (pos e1) p2) s
+	| [< '(Dollar v,p2); s >] -> expr_next (EField (e1,"$"^v) , punion (pos e1) p2) s
+	| [< >] ->
+		(* turn an integer followed by a dot into a float *)
+		match e1 with
+		| (EConst (Int v),p2) when p2.pmax = p.pmin -> expr_next (EConst (Float (v ^ ".")),punion p p2) s
+		| _ -> serror()
+	end
+
 and parse_guard = parser
 	| [< '(Kwd If,p1); '(POpen,_); e = expr; '(PClose,_); >] ->
 		e

+ 1 - 0
tests/misc/projects/Issue7210/compile.hxml

@@ -0,0 +1 @@
+--macro "macro.Utils.hello()"

+ 1 - 0
tests/misc/projects/Issue7210/compile.hxml.stderr

@@ -0,0 +1 @@
+Ok!

+ 8 - 0
tests/misc/projects/Issue7210/macro/Utils.hx

@@ -0,0 +1,8 @@
+package macro;
+
+class Utils {
+	macro static function hello() {
+		Sys.stderr().writeString('Ok!');
+		return macro {}
+	}
+}