summaryrefslogtreecommitdiff
path: root/dtc-parser.y
diff options
context:
space:
mode:
authorDavid Gibson <dgibson@sneetch.(none)>2005-06-08 17:18:34 +1000
committerDavid Gibson <dgibson@sneetch.(none)>2005-06-08 17:18:34 +1000
commitfc14dad7692d84d5f0f547fd0456b3f98526b6cc (patch)
tree9fba031b6dfd273fcb78d23e9ff6e869cce9df97 /dtc-parser.y
downloaddtc-fc14dad7692d84d5f0f547fd0456b3f98526b6cc.tar.gz
Initial commit
Diffstat (limited to 'dtc-parser.y')
-rw-r--r--dtc-parser.y116
1 files changed, 116 insertions, 0 deletions
diff --git a/dtc-parser.y b/dtc-parser.y
new file mode 100644
index 0000000..f177fb7
--- /dev/null
+++ b/dtc-parser.y
@@ -0,0 +1,116 @@
+/*
+ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+%{
+#include "dtc.h"
+
+int yylex (void);
+void yyerror (char const *);
+
+extern struct node *device_tree;
+
+%}
+
+%union {
+ cell_t cval;
+ uint8_t byte;
+ char *str;
+ struct data data;
+ struct property *prop;
+ struct property *proplist;
+ struct node *node;
+ struct node *nodelist;
+ int datalen;
+ int hexlen;
+}
+
+%token <str> DT_PROPNAME
+%token <str> DT_NODENAME
+%token <cval> DT_CELL
+%token <byte> DT_BYTE
+%token <data> DT_STRING
+%token <str> DT_UNIT
+
+%type <data> propdata
+%type <data> celllist
+%type <data> bytestring
+%type <prop> propdef
+%type <proplist> proplist
+
+%type <node> nodedef
+%type <node> subnode
+%type <nodelist> subnodes
+
+%%
+
+devicetree: {
+ assert(device_tree == NULL);
+ } '/' nodedef { device_tree = name_node($3, ""); }
+ ;
+
+nodedef: '{' proplist subnodes '}' ';' {
+ $$ = build_node($2, $3);
+ }
+ ;
+
+proplist: propdef proplist {
+ $$ = chain_property($1, $2);
+ }
+ | /* empty */ {
+ $$ = NULL;
+ }
+ ;
+
+propdef: DT_PROPNAME '=' propdata ';' {
+ $$ = build_property($1, $3);
+ }
+ | DT_PROPNAME ';' {
+ $$ = build_empty_property($1);
+ }
+ ;
+
+propdata: DT_STRING { $$ = $1; }
+ | '<' celllist '>' { $$ = $2; }
+ | '[' bytestring ']' { $$ = $2; }
+ ;
+
+celllist: celllist DT_CELL { $$ = data_append_cell($1, $2); }
+ | /* empty */ { $$ = empty_data; }
+ ;
+
+bytestring: bytestring DT_BYTE { $$ = data_append_byte($1, $2); }
+ | /* empty */ { $$ = empty_data; }
+ ;
+
+subnodes: subnode subnodes {
+ $$ = chain_node($1, $2);
+ }
+ | /* empty */ { $$ = NULL; }
+ ;
+
+subnode: DT_NODENAME nodedef { $$ = name_node($2, $1); }
+ ;
+
+%%
+
+void yyerror (char const *s)
+{
+ fprintf (stderr, "%s\n", s);
+}