Module Name:    src
Committed By:   dholland
Date:           Sun Mar 11 02:56:25 UTC 2012

Modified Files:
        src/usr.bin/config: gram.y

Log Message:
Write out the expression grammar for dependency constraints instead of
using precedence rules. Precedence rules (besides being a hack) often
lead to unexpected/unwanted behavior in corner cases.


To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.30 src/usr.bin/config/gram.y

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/config/gram.y
diff -u src/usr.bin/config/gram.y:1.29 src/usr.bin/config/gram.y:1.30
--- src/usr.bin/config/gram.y:1.29	Sun Mar 11 02:43:33 2012
+++ src/usr.bin/config/gram.y	Sun Mar 11 02:56:25 2012
@@ -1,5 +1,5 @@
 %{
-/*	$NetBSD: gram.y,v 1.29 2012/03/11 02:43:33 dholland Exp $	*/
+/*	$NetBSD: gram.y,v 1.30 2012/03/11 02:56:25 dholland Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -123,10 +123,8 @@ static	struct nvlist *mk_ns(const char *
 %token	<str> PATHNAME QSTRING WORD EMPTYSTRING
 %token	ENDDEFS
 
-%left '|'
-%left '&'
-
 %type	<list>	fopts fexpr fatom
+%type	<list>	f_or_expr f_and_expr f_prefix_expr f_base_expr
 %type	<str>	fs_spec
 %type	<val>	fflgs fflag oflgs oflag
 %type	<str>	rule
@@ -755,12 +753,29 @@ device_flags:
  */
 
 /* expression of config elements */
-/* XXX this should use a real expression grammar */
 fexpr:
+	f_or_expr
+;
+
+f_or_expr:
+	  f_and_expr
+	| f_or_expr '|' f_and_expr	{ $$ = fx_or($1, $3); }
+;
+
+f_and_expr:
+	  f_prefix_expr
+	| f_and_expr '&' f_prefix_expr	{ $$ = fx_and($1, $3); }
+;
+
+f_prefix_expr:
+	  f_base_expr
+/* XXX notyet - need to strengthen downstream first */
+/*	| '!' f_prefix_expr		{ $$ = fx_not($2); } */
+;
+
+f_base_expr:
 	  fatom				{ $$ = $1; }
 	| '!' fatom			{ $$ = fx_not($2); }
-	| fexpr '&' fexpr		{ $$ = fx_and($1, $3); }
-	| fexpr '|' fexpr		{ $$ = fx_or($1, $3); }
 	| '(' fexpr ')'			{ $$ = $2; }
 ;
 

Reply via email to