diff options
author | David Gibson <dgibson@sneetch.(none)> | 2005-06-08 17:18:34 +1000 |
---|---|---|
committer | David Gibson <dgibson@sneetch.(none)> | 2005-06-08 17:18:34 +1000 |
commit | fc14dad7692d84d5f0f547fd0456b3f98526b6cc (patch) | |
tree | 9fba031b6dfd273fcb78d23e9ff6e869cce9df97 /dtc-parser.y | |
download | dtc-fc14dad7692d84d5f0f547fd0456b3f98526b6cc.tar.gz |
Initial commit
Diffstat (limited to 'dtc-parser.y')
-rw-r--r-- | dtc-parser.y | 116 |
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); +} |