diff options
author | Vincent Sanders <vince@kyllikki.org> | 2015-07-21 23:48:45 +0100 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2015-07-21 23:48:45 +0100 |
commit | 1288d8c535edd2ce29eebdc4acca6b2beab89841 (patch) | |
tree | 162bd2d090e03a7ffb9523797c1dd2aebbce236f /src/nsgenbind-parser.y | |
parent | 94137186a3e2270e9b96f243a82a77a590c17f01 (diff) | |
download | nsgenbind-1288d8c535edd2ce29eebdc4acca6b2beab89841.tar.gz nsgenbind-1288d8c535edd2ce29eebdc4acca6b2beab89841.tar.bz2 |
Change binding grammar to new approach.
Diffstat (limited to 'src/nsgenbind-parser.y')
-rw-r--r-- | src/nsgenbind-parser.y | 386 |
1 files changed, 216 insertions, 170 deletions
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y index b37ab9d..c8e5154 100644 --- a/src/nsgenbind-parser.y +++ b/src/nsgenbind-parser.y @@ -10,6 +10,12 @@ #include <stdio.h> #include <string.h> +#define YYFPRINTF genbind_fprintf +#define YY_LOCATION_PRINT(File, Loc) \ + genbind_fprintf(File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) + #include "nsgenbind-parser.h" #include "nsgenbind-lexer.h" #include "webidl-ast.h" @@ -17,7 +23,9 @@ char *errtxt; - static void nsgenbind_error(YYLTYPE *locp, struct genbind_node **genbind_ast, const char *str) +static void nsgenbind_error(YYLTYPE *locp, + struct genbind_node **genbind_ast, + const char *str) { locp = locp; genbind_ast = genbind_ast; @@ -37,31 +45,36 @@ char *errtxt; %union { - char* text; + char *text; struct genbind_node *node; long value; } -%token TOK_IDLFILE -%token TOK_HDR_COMMENT -%token TOK_PREAMBLE -%token TOK_PROLOGUE; -%token TOK_EPILOGUE; - -%token TOK_API %token TOK_BINDING -%token TOK_OPERATION -%token TOK_GETTER -%token TOK_SETTER -%token TOK_INTERFACE -%token TOK_FLAGS -%token TOK_TYPE +%token TOK_WEBIDL +%token TOK_PREFACE +%token TOK_PROLOGUE +%token TOK_EPILOGUE +%token TOK_POSTFACE + +%token TOK_CLASS %token TOK_PRIVATE %token TOK_INTERNAL +%token TOK_FLAGS +%token TOK_TYPE %token TOK_UNSHARED %token TOK_SHARED %token TOK_PROPERTY + /* method types */ +%token TOK_INIT +%token TOK_FINI +%token TOK_METHOD +%token TOK_GETTER +%token TOK_SETTER + +%token TOK_DBLCOLON + %token <text> TOK_IDENTIFIER %token <text> TOK_STRING_LITERAL %token <text> TOK_CCODE_LITERAL @@ -73,28 +86,30 @@ char *errtxt; %type <node> Statement %type <node> Statements -%type <node> IdlFile -%type <node> Preamble -%type <node> Prologue -%type <node> Epilogue -%type <node> HdrComment -%type <node> Strings %type <node> Binding %type <node> BindingArgs %type <node> BindingArg +%type <node> Class +%type <node> ClassArgs +%type <node> ClassArg +%type <node> ClassFlag +%type <node> ClassFlags + +%type <node> Method +%type <node> MethodDeclarator +%type <value> MethodType + +%type <node> WebIDL +%type <node> Preface +%type <node> Prologue +%type <node> Epilogue +%type <node> Postface %type <node> Private %type <node> Internal -%type <node> Interface -%type <node> InterfaceArgs -%type <node> InterfaceArg -%type <node> InterfaceFlags %type <node> Property -%type <node> Operation -%type <node> Api -%type <node> Getter -%type <node> Setter - +%type <node> ParameterList +%type <node> TypeIdent %% @@ -126,68 +141,77 @@ Statements Statement : - IdlFile - | - HdrComment - | - Preamble - | - Prologue - | - Epilogue - | Binding | - Operation - | - Api + Class | - Getter - | - Setter + Method ; - /* [3] load a web IDL file */ -IdlFile - : - TOK_IDLFILE TOK_STRING_LITERAL ';' +Binding + : + TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}' { - $$ = genbind_new_node(GENBIND_NODE_TYPE_WEBIDLFILE, NULL, $2); + $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING, + NULL, + genbind_new_node(GENBIND_NODE_TYPE_TYPE, $4, $2)); } ; -HdrComment - : - TOK_HDR_COMMENT Strings ';' +BindingArgs + : + BindingArg + | + BindingArgs BindingArg { - $$ = genbind_new_node(GENBIND_NODE_TYPE_HDRCOMMENT, NULL, $2); + $$ = genbind_node_link($2, $1); } ; -Strings +BindingArg : - TOK_STRING_LITERAL + WebIDL + | + Preface + | + Prologue + | + Epilogue + | + Postface + ; + + /* [3] a web IDL file specifier */ +WebIDL + : + TOK_WEBIDL TOK_STRING_LITERAL ';' { - $$ = genbind_new_node(GENBIND_NODE_TYPE_STRING, NULL, $1); + $$ = genbind_new_node(GENBIND_NODE_TYPE_WEBIDL, NULL, $2); } - | - Strings TOK_STRING_LITERAL + ; + + + /* type and identifier of a variable */ +TypeIdent + : + TOK_STRING_LITERAL TOK_IDENTIFIER { - $$ = genbind_new_node(GENBIND_NODE_TYPE_STRING, $1, $2); + $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, + genbind_new_node(GENBIND_NODE_TYPE_TYPE, NULL, $1), $2); } ; -Preamble +Preface : - TOK_PREAMBLE CBlock + TOK_PREFACE CBlock ';' { - $$ = genbind_new_node(GENBIND_NODE_TYPE_PREAMBLE, NULL, $2); + $$ = genbind_new_node(GENBIND_NODE_TYPE_PREFACE, NULL, $2); } ; Prologue : - TOK_PROLOGUE CBlock + TOK_PROLOGUE CBlock ';' { $$ = genbind_new_node(GENBIND_NODE_TYPE_PROLOGUE, NULL, $2); } @@ -195,173 +219,196 @@ Prologue Epilogue : - TOK_EPILOGUE CBlock + TOK_EPILOGUE CBlock ';' { $$ = genbind_new_node(GENBIND_NODE_TYPE_EPILOGUE, NULL, $2); } ; +Postface + : + TOK_POSTFACE CBlock ';' + { + $$ = genbind_new_node(GENBIND_NODE_TYPE_POSTFACE, NULL, $2); + } + ; + CBlock - : + : TOK_CCODE_LITERAL - | - CBlock TOK_CCODE_LITERAL + | + CBlock TOK_CCODE_LITERAL { $$ = genbind_strapp($1, $2); } ; -Operation +MethodType : - TOK_OPERATION TOK_IDENTIFIER CBlock + TOK_INIT { - $$ = genbind_new_node(GENBIND_NODE_TYPE_OPERATION, - NULL, - genbind_new_node(GENBIND_NODE_TYPE_IDENT, - genbind_new_node(GENBIND_NODE_TYPE_CBLOCK, - NULL, - $3), - $2)); + $$ = GENBIND_METHOD_TYPE_INIT; } + | + TOK_FINI + { + $$ = GENBIND_METHOD_TYPE_FINI; + } + | + TOK_METHOD + { + $$ = GENBIND_METHOD_TYPE_METHOD; + } + | + TOK_GETTER + { + $$ = GENBIND_METHOD_TYPE_GETTER; + } + | + TOK_SETTER + { + $$ = GENBIND_METHOD_TYPE_SETTER; + } + ; -Api +ParameterList : - TOK_API TOK_IDENTIFIER CBlock + TypeIdent + { + $$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1); + } + | + ParameterList ',' TypeIdent { - $$ = genbind_new_node(GENBIND_NODE_TYPE_API, - NULL, - genbind_new_node(GENBIND_NODE_TYPE_IDENT, - genbind_new_node(GENBIND_NODE_TYPE_CBLOCK, - NULL, - $3), - $2)); + $$ = genbind_node_link($3, $1); } + ; -Getter +MethodDeclarator : - TOK_GETTER TOK_IDENTIFIER CBlock + TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER '(' ParameterList ')' { - $$ = genbind_new_node(GENBIND_NODE_TYPE_GETTER, - NULL, - genbind_new_node(GENBIND_NODE_TYPE_IDENT, - genbind_new_node(GENBIND_NODE_TYPE_CBLOCK, - NULL, - $3), - $2)); + $$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS, + genbind_new_node(GENBIND_NODE_TYPE_IDENT, + $5, + $3), + genbind_new_node(GENBIND_NODE_TYPE_IDENT, + NULL, + $1)); } + | + TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER '(' ')' + { + $$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS, + genbind_new_node(GENBIND_NODE_TYPE_IDENT, + NULL, + $3), + genbind_new_node(GENBIND_NODE_TYPE_IDENT, + NULL, + $1)); + } + | + TOK_IDENTIFIER '(' ParameterList ')' + { + $$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS, + $3, + genbind_new_node(GENBIND_NODE_TYPE_IDENT, + NULL, + $1)); + } + | + TOK_IDENTIFIER '(' ')' + { + $$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS, NULL, + genbind_new_node(GENBIND_NODE_TYPE_IDENT, + NULL, + $1)); + } + ; -Setter +Method : - TOK_SETTER TOK_IDENTIFIER CBlock + MethodType MethodDeclarator CBlock { - $$ = genbind_new_node(GENBIND_NODE_TYPE_SETTER, - NULL, - genbind_new_node(GENBIND_NODE_TYPE_IDENT, - genbind_new_node(GENBIND_NODE_TYPE_CBLOCK, - NULL, - $3), - $2)); + $$ = genbind_new_node(GENBIND_NODE_TYPE_METHOD, NULL, + genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE, + genbind_new_node(GENBIND_NODE_TYPE_CDATA, + $2, $3), + (void *)$1)); } -Binding + +Class : - TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}' + TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}' { - $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING, - NULL, - genbind_new_node(GENBIND_NODE_TYPE_TYPE, $4, $2)); + $$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS, NULL, + genbind_new_node(GENBIND_NODE_TYPE_IDENT, $4, $2)); } ; -BindingArgs +ClassArgs : - BindingArg + ClassArg | - BindingArgs BindingArg + ClassArgs ClassArg { - $$ = genbind_node_link($2, $1); + $$ = genbind_node_link($2, $1); } ; -BindingArg - : +ClassArg + : Private | Internal | - Interface - | Property + | + ClassFlag + | + Preface + | + Prologue + | + Epilogue + | + Postface ; + Private : - TOK_PRIVATE TOK_STRING_LITERAL TOK_IDENTIFIER ';' + TOK_PRIVATE TypeIdent ';' { - $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING_PRIVATE, NULL, - genbind_new_node(GENBIND_NODE_TYPE_IDENT, - genbind_new_node(GENBIND_NODE_TYPE_STRING, NULL, $2), $3)); + $$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2); } ; Internal : - TOK_INTERNAL TOK_STRING_LITERAL TOK_IDENTIFIER ';' + TOK_INTERNAL TypeIdent ';' { - $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING_INTERNAL, NULL, - genbind_new_node(GENBIND_NODE_TYPE_IDENT, - genbind_new_node(GENBIND_NODE_TYPE_STRING, NULL, $2), $3)); + $$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2); } ; -Interface - : - TOK_INTERFACE TOK_IDENTIFIER ';' - { - $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING_INTERFACE, NULL, - genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $2)); - } - | - TOK_INTERFACE TOK_IDENTIFIER '{' '}' - { - $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING_INTERFACE, NULL, - genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $2)); - } - | - TOK_INTERFACE TOK_IDENTIFIER '{' InterfaceArgs '}' - { - $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING_INTERFACE, - NULL, - genbind_new_node(GENBIND_NODE_TYPE_IDENT, $4, $2)); - } - ; - -InterfaceArgs +ClassFlag : - InterfaceArg - | - InterfaceArgs InterfaceArg - { - $$ = genbind_node_link($2, $1); - } - ; - -InterfaceArg - : - TOK_FLAGS InterfaceFlags ';' + TOK_FLAGS ClassFlags ';' { - $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING_INTERFACE_FLAGS, NULL, $2); + $$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2); } ; -InterfaceFlags +ClassFlags : TOK_IDENTIFIER { $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $1); } | - InterfaceFlags ',' TOK_IDENTIFIER + ClassFlags ',' TOK_IDENTIFIER { $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $3); } @@ -371,13 +418,12 @@ Property : TOK_PROPERTY Modifiers TOK_IDENTIFIER ';' { - $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING_PROPERTY, - NULL, - genbind_new_node(GENBIND_NODE_TYPE_MODIFIER, - genbind_new_node(GENBIND_NODE_TYPE_IDENT, - NULL, - $3), - (void *)$2)); + $$ = genbind_new_node(GENBIND_NODE_TYPE_PROPERTY, NULL, + genbind_new_node(GENBIND_NODE_TYPE_MODIFIER, + genbind_new_node(GENBIND_NODE_TYPE_IDENT, + NULL, + $3), + (void *)$2)); } ; |