This re-implements labels within property values as a form of bytestring
expression.  The grammar gets a little hairy to handle the fact that
labels are allowed both at the beginning and end of property values without
introducing parser conflicts.

Signed-off-by: David Gibson <[email protected]>
---
 dtc-parser.y | 38 ++++++++++++++++++++++++++++----------
 1 file changed, 28 insertions(+), 10 deletions(-)

diff --git a/dtc-parser.y b/dtc-parser.y
index fcc3b4d..bff22d9 100644
--- a/dtc-parser.y
+++ b/dtc-parser.y
@@ -93,6 +93,7 @@ static struct data expr_bytestring(struct expression *expr);
 
 %type <expr> expr_incbin
 %type <expr> expr_prim
+%type <expr> expr_prelabel
 %type <expr> expr_unary
 %type <expr> expr_mul
 %type <expr> expr_add
@@ -105,6 +106,7 @@ static struct data expr_bytestring(struct expression *expr);
 %type <expr> expr_and
 %type <expr> expr_or
 %type <expr> expr_conditional
+%type <expr> expr_postlabel
 %type <expr> expr
 
 %%
@@ -221,10 +223,6 @@ propdata:
                {
                        $$ = data_add_marker($1, REF_PATH, $2);
                }
-       | propdata DT_LABEL
-               {
-                       $$ = data_add_marker($1, LABEL, $2);
-               }
        ;
 
 propdataprefix:
@@ -236,10 +234,6 @@ propdataprefix:
                {
                        $$ = $1;
                }
-       | propdataprefix DT_LABEL
-               {
-                       $$ = data_add_marker($1, LABEL, $2);
-               }
        ;
 
 array:
@@ -338,7 +332,19 @@ expr_prim:
        ;
 
 expr:
-       expr_conditional
+         expr_postlabel
+       ;
+
+expr_postlabel:
+         expr_conditional
+       | expr_conditional DT_LABEL
+               {
+                       struct data d = data_add_marker(empty_data, LABEL, $2);
+                       struct expression *label;
+
+                       label = expression_bytestring_constant(&@2, d);
+                       $$ = expression_join(&@$, $1, label);
+               }
        ;
 
 expr_conditional:
@@ -408,12 +414,24 @@ expr_mul:
        ;
 
 expr_unary:
-         expr_prim
+         expr_prelabel
        | '-' expr_unary { $$ = UNOP(@$, negate, $2); }
        | '~' expr_unary { $$ = UNOP(@$, bit_not, $2); }
        | '!' expr_unary { $$ = UNOP(@$, logic_not, $2); }
        ;
 
+expr_prelabel:
+         expr_prim
+       | DT_LABEL expr_prelabel
+               {
+                       struct data d = data_add_marker(empty_data, LABEL, $1);
+                       struct expression *label;
+
+                       label = expression_bytestring_constant(&@1, d);
+                       $$ = expression_join(&@$, label, $2);
+               }
+       ;
+
 bytestring_literal:
          /* empty */
                {
-- 
1.8.5.3

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to