]> pilppa.org Git - familiar-h63xx-build.git/blobdiff - bitbake/lib/bb/parse/parse_c/bitbakeparser.y
import bitbake from svn as of revision 323
[familiar-h63xx-build.git] / bitbake / lib / bb / parse / parse_c / bitbakeparser.y
diff --git a/bitbake/lib/bb/parse/parse_c/bitbakeparser.y b/bitbake/lib/bb/parse/parse_c/bitbakeparser.y
new file mode 100644 (file)
index 0000000..4bc81a9
--- /dev/null
@@ -0,0 +1,161 @@
+/* bbp.lemon 
+
+   written by Marc Singer
+   6 January 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.
+
+   DESCRIPTION
+   -----------
+
+   lemon parser specification file for a BitBake input file parser.
+
+   Most of the interesting shenanigans are done in the lexer.  The
+   BitBake grammar is not regular.  In order to emit tokens that
+   the parser can properly interpret in LALR fashion, the lexer
+   manages the interpretation state.  This is why there are ISYMBOLs,
+   SYMBOLS, and TSYMBOLS.
+
+   This parser was developed by reading the limited available
+   documentation for BitBake and by analyzing the available BB files.
+   There is no assertion of correctness to be made about this parser.
+
+*/
+
+%token_type {token_t}
+%name bbparse
+%token_prefix   T_
+%extra_argument  {lex_t* lex}
+
+%include {
+#include "token.h"
+}
+
+
+%token_destructor { $$.release_this (); }
+
+%syntax_error     { printf ("%s:%d: syntax error\n",
+                    lex->filename (), lex->line ()); }
+
+program ::= statements.
+
+statements ::= statements statement.
+statements ::= .
+
+variable(r) ::= SYMBOL(s).
+        { r.assignString( s.string() );
+          s.assignString( 0 );
+          s.release_this(); }
+variable(r) ::= VARIABLE(v).
+        {
+          r.assignString( v.string() );
+          v.assignString( 0 );
+          v.release_this(); }
+
+statement ::= EXPORT variable(s) OP_ASSIGN STRING(v).
+        { e_assign( s.string(), v.string() );
+          e_export( s.string() );
+          s.release_this(); v.release_this(); }
+statement ::= EXPORT variable(s) OP_IMMEDIATE STRING(v).
+        { e_immediate (s.string(), v.string() );
+          e_export( s.string() );
+          s.release_this(); v.release_this(); }
+statement ::= EXPORT variable(s) OP_COND STRING(v).
+        { e_cond( s.string(), v.string() );
+          s.release_this(); v.release_this(); }
+
+statement ::= variable(s) OP_ASSIGN STRING(v).
+        { e_assign( s.string(), v.string() );
+          s.release_this(); v.release_this(); }
+statement ::= variable(s) OP_PREPEND STRING(v).
+        { e_prepend( s.string(), v.string() );
+          s.release_this(); v.release_this(); }
+statement ::= variable(s) OP_APPEND STRING(v).
+        { e_append( s.string() , v.string() );
+          s.release_this(); v.release_this(); }
+statement ::= variable(s) OP_IMMEDIATE STRING(v).
+        { e_immediate( s.string(), v.string() );
+          s.release_this(); v.release_this(); }
+statement ::= variable(s) OP_COND STRING(v).
+        { e_cond( s.string(), v.string() );
+          s.release_this(); v.release_this(); }
+
+task ::= TSYMBOL(t) BEFORE TSYMBOL(b) AFTER  TSYMBOL(a).
+        { e_addtask( t.string(), b.string(), a.string() );
+          t.release_this(); b.release_this(); a.release_this(); }
+task ::= TSYMBOL(t) AFTER  TSYMBOL(a) BEFORE TSYMBOL(b).
+        { e_addtask( t.string(), b.string(), a.string());
+          t.release_this(); a.release_this(); b.release_this(); }
+task ::= TSYMBOL(t).
+        { e_addtask( t.string(), NULL, NULL);
+          t.release_this();}
+task ::= TSYMBOL(t) BEFORE TSYMBOL(b).
+        { e_addtask( t.string(), b.string(), NULL);
+          t.release_this(); b.release_this(); }
+task ::= TSYMBOL(t) AFTER  TSYMBOL(a).
+        { e_addtask( t.string(), NULL, a.string());
+          t.release_this(); a.release_this(); }
+tasks ::= tasks task.
+tasks ::= task.
+statement ::= ADDTASK tasks.
+
+statement ::= ADDHANDLER SYMBOL(s).
+        { e_addhandler( s.string()); s.release_this (); }
+
+func ::= FSYMBOL(f). { e_export_func(f.string()); f.release_this(); }
+funcs ::= funcs func.
+funcs ::= func.
+statement ::= EXPORT_FUNC funcs.
+
+inherit ::= ISYMBOL(i). { e_inherit(i.string() ); i.release_this (); }
+inherits ::= inherits inherit.
+inherits ::= inherit.
+statement ::= INHERIT inherits.
+
+statement ::= INCLUDE ISYMBOL(i).
+        { e_include(i.string() ); i.release_this(); }
+
+proc_body(r) ::= proc_body(l) PROC_BODY(b). 
+        { /* concatenate body lines */
+          r.assignString( token_t::concatString(l.string(), b.string()) );
+          l.release_this ();
+          b.release_this ();
+        }
+proc_body(b) ::= . { b.assignString(0); }
+statement ::= variable(p) PROC_OPEN proc_body(b) PROC_CLOSE.
+        { e_proc( p.string(), b.string() );
+          p.release_this(); b.release_this(); }
+statement ::= PYTHON SYMBOL(p) PROC_OPEN proc_body(b) PROC_CLOSE.
+        { e_proc_python (p.string(), b.string() );
+          p.release_this(); b.release_this(); }
+statement ::= PYTHON PROC_OPEN proc_body(b) PROC_CLOSE.
+        { e_proc_python( NULL, b.string());
+          b.release_this (); }
+
+statement ::= FAKEROOT SYMBOL(p) PROC_OPEN proc_body(b) PROC_CLOSE.
+        { e_proc_fakeroot(p.string(), b.string() );
+          p.release_this (); b.release_this (); }
+
+def_body(r) ::= def_body(l) DEF_BODY(b).
+        { /* concatenate body lines */
+          r.assignString( token_t::concatString(l.string(), b.string());
+          l.release_this (); b.release_this ();
+        }
+def_body(b) ::= . { b.sz = 0; }
+statement ::= SYMBOL(p) DEF_ARGS(a) def_body(b).
+        { e_def( p.string(), a.string(), b.string());
+          p.release_this(); a.release_this(); b.release_this(); }
+