aboutsummaryrefslogtreecommitdiff
path: root/dtc-parser.y
diff options
context:
space:
mode:
authorDavid Gibson <dgibson@sneetch.(none)>2005-06-16 14:36:37 +1000
committerDavid Gibson <dgibson@sneetch.(none)>2005-06-16 14:36:37 +1000
commit4102d840d993e7cce7d5c5aea8ef696dc81236fc (patch)
treeab70f0a9e968780ed282f1bbd8d7ea1be3db5b6b /dtc-parser.y
parentfc14dad7692d84d5f0f547fd0456b3f98526b6cc (diff)
downloaddtc-4102d840d993e7cce7d5c5aea8ef696dc81236fc.zip
dtc-4102d840d993e7cce7d5c5aea8ef696dc81236fc.tar.gz
dtc-4102d840d993e7cce7d5c5aea8ef696dc81236fc.tar.bz2
Initial label support. Also switch to glr-parser mode and get rid of
hacks that were necessary without it.
Diffstat (limited to 'dtc-parser.y')
-rw-r--r--dtc-parser.y25
1 files changed, 19 insertions, 6 deletions
diff --git a/dtc-parser.y b/dtc-parser.y
index f177fb7..785acd1 100644
--- a/dtc-parser.y
+++ b/dtc-parser.y
@@ -47,6 +47,7 @@ extern struct node *device_tree;
%token <byte> DT_BYTE
%token <data> DT_STRING
%token <str> DT_UNIT
+%token <str> DT_LABEL
%type <data> propdata
%type <data> celllist
@@ -57,12 +58,16 @@ extern struct node *device_tree;
%type <node> nodedef
%type <node> subnode
%type <nodelist> subnodes
+%type <str> label
+%type <str> nodename
+
+%glr-parser
%%
devicetree: {
assert(device_tree == NULL);
- } '/' nodedef { device_tree = name_node($3, ""); }
+ } '/' nodedef { device_tree = name_node($3, "", NULL); }
;
nodedef: '{' proplist subnodes '}' ';' {
@@ -78,11 +83,11 @@ proplist: propdef proplist {
}
;
-propdef: DT_PROPNAME '=' propdata ';' {
- $$ = build_property($1, $3);
+propdef: label DT_PROPNAME '=' propdata ';' {
+ $$ = build_property($2, $4, $1);
}
- | DT_PROPNAME ';' {
- $$ = build_empty_property($1);
+ | label DT_PROPNAME ';' {
+ $$ = build_empty_property($2, $1);
}
;
@@ -105,7 +110,15 @@ subnodes: subnode subnodes {
| /* empty */ { $$ = NULL; }
;
-subnode: DT_NODENAME nodedef { $$ = name_node($2, $1); }
+subnode: label nodename nodedef { $$ = name_node($3, $2, $1); }
+ ;
+
+nodename: DT_NODENAME { $$ = $1; }
+ | DT_PROPNAME { $$ = $1; }
+ ;
+
+label: DT_LABEL { $$ = $1; }
+ | /* empty */ { $$ = NULL; }
;
%%