shithub: mc

Download patch

ref: 8cc25499958961ae0a2afbe142b929f01cf34cbe
parent: 0139ee45f197942d81737539f64d9723968181ba
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Feb 13 15:33:11 EST 2017

Clean up warnings about ambiguous grammar.

--- a/parse/gram.y
+++ b/parse/gram.y
@@ -159,6 +159,26 @@
 
 %type <uconlist> unionbody
 
+/*
+We want to bind more tightly to `Foo unaryexpr
+than to binary operators around it. Eg:
+
+	`Foo +bar
+
+should be interpreted as
+
+	(`Foo (+bar))
+
+and not
+
+	(`Foo) + (bar)
+
+The default action of shifting does the right thing,
+but warnings suck.
+*/
+%left Ttick
+%left Tplus Tminus Tband
+
 %union {
 	struct {
 		Srcloc loc;
@@ -683,15 +703,15 @@
 shiftop : Tbsl | Tbsr;
 
 prefixexpr
-	: Tinc prefixexpr      {$$ = mkexpr($1->loc, Opreinc, $2, NULL);}
-	| Tdec prefixexpr      {$$ = mkexpr($1->loc, Opredec, $2, NULL);}
-	| Tband prefixexpr     {$$ = mkexpr($1->loc, Oaddr, $2, NULL);}
-	| Tlnot prefixexpr     {$$ = mkexpr($1->loc, Olnot, $2, NULL);}
-	| Tbnot prefixexpr     {$$ = mkexpr($1->loc, Obnot, $2, NULL);}
-	| Tminus prefixexpr    {$$ = mkexpr($1->loc, Oneg, $2, NULL);}
-	| Tplus prefixexpr     {$$ = $2;} /* positive is a nop */
-	| Ttick name prefixexpr {$$ = mkexpr($1->loc, Oucon, $2, $3, NULL);}
-	| Ttick name {$$ = mkexpr($1->loc, Oucon, $2, NULL);}
+	: Tinc prefixexpr	{$$ = mkexpr($1->loc, Opreinc, $2, NULL);}
+	| Tdec prefixexpr	{$$ = mkexpr($1->loc, Opredec, $2, NULL);}
+	| Tband prefixexpr	{$$ = mkexpr($1->loc, Oaddr, $2, NULL);}
+	| Tlnot prefixexpr	{$$ = mkexpr($1->loc, Olnot, $2, NULL);}
+	| Tbnot prefixexpr	{$$ = mkexpr($1->loc, Obnot, $2, NULL);}
+	| Tminus prefixexpr	{$$ = mkexpr($1->loc, Oneg, $2, NULL);}
+	| Tplus prefixexpr	{$$ = $2;} /* positive is a nop */
+	| Ttick name prefixexpr	{$$ = mkexpr($1->loc, Oucon, $2, $3, NULL);}
+	| Ttick name 		{$$ = mkexpr($1->loc, Oucon, $2, NULL);}
 	| postfixexpr
 	;