summaryrefslogtreecommitdiff
path: root/src/nsgenbind-parser.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/nsgenbind-parser.y')
-rw-r--r--src/nsgenbind-parser.y448
1 files changed, 307 insertions, 141 deletions
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index 46bc4f3..1462b39 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,13 +23,74 @@
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;
errtxt = strdup(str);
}
+static struct genbind_node *
+add_method(struct genbind_node **genbind_ast,
+ long methodtype,
+ struct genbind_node *declarator,
+ char *cdata)
+{
+ struct genbind_node *res_node;
+ struct genbind_node *method_node;
+ struct genbind_node *class_node;
+ struct genbind_node *cdata_node;
+ char *class_name;
+
+ /* extract the class name from the declarator */
+ class_name = genbind_node_gettext(
+ genbind_node_find_type(
+ genbind_node_getnode(
+ genbind_node_find_type(
+ declarator,
+ NULL,
+ GENBIND_NODE_TYPE_CLASS)),
+ NULL,
+ GENBIND_NODE_TYPE_IDENT));
+
+ if (cdata == NULL) {
+ cdata_node = declarator;
+ } else {
+ cdata_node = genbind_new_node(GENBIND_NODE_TYPE_CDATA,
+ declarator,
+ cdata);
+ }
+
+ /* generate method node */
+ method_node = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
+ cdata_node,
+ (void *)methodtype));
+
+ class_node = genbind_node_find_type_ident(*genbind_ast,
+ NULL,
+ GENBIND_NODE_TYPE_CLASS,
+ class_name);
+ if (class_node == NULL) {
+ /* no existing class so manufacture one and attach method */
+ res_node = genbind_new_node(GENBIND_NODE_TYPE_CLASS, NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_IDENT,
+ method_node,
+ class_name));
+
+ } else {
+ /* update the existing class */
+
+ /* link member node into class_node */
+ genbind_node_add(class_node, method_node);
+
+ res_node = NULL; /* updating so no need to add a new node */
+ }
+ return res_node;
+}
%}
@@ -37,30 +104,37 @@ 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_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_PROTOTYPE
+
+%token TOK_DBLCOLON
+
%token <text> TOK_IDENTIFIER
%token <text> TOK_STRING_LITERAL
%token <text> TOK_CCODE_LITERAL
@@ -72,25 +146,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> Type
+%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> Property
-%type <node> Operation
-%type <node> Api
-%type <node> Getter
-%type <node> Setter
+%type <node> ParameterList
+%type <node> TypeIdent
%%
@@ -109,7 +188,7 @@ Statements
|
Statements Statement
{
- $$ = genbind_node_link($2, $1);
+ $$ = *genbind_ast = genbind_node_prepend($2, $1);
}
|
error ';'
@@ -122,68 +201,88 @@ Statements
Statement
:
- IdlFile
- |
- HdrComment
- |
- Preamble
- |
- Prologue
- |
- Epilogue
- |
Binding
|
- Operation
- |
- Api
- |
- Getter
+ Class
|
- 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_IDENT,
+ genbind_new_node(GENBIND_NODE_TYPE_TYPE, NULL, $1), $2);
+ }
+ |
+ TOK_STRING_LITERAL TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_STRING, $1, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
+ genbind_new_node(GENBIND_NODE_TYPE_IDENT,
+ genbind_new_node(GENBIND_NODE_TYPE_TYPE,
+ NULL,
+ $1),
+ $2),
+ $4);
}
;
-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);
}
@@ -191,140 +290,208 @@ 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_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;
+ }
+ |
+ TOK_PROTOTYPE
{
- $$ = 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_PROTOTYPE;
}
+ ;
-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_prepend($1,
+ genbind_new_node(
+ GENBIND_NODE_TYPE_PARAMETER,
+ NULL,
+ $3));
}
+ ;
-Getter
+MethodDeclarator
:
- TOK_GETTER TOK_IDENTIFIER CBlock
+ TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER '(' ParameterList ')'
+ {
+ $$ = 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_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,
+ 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
+ {
+ $$ = add_method(genbind_ast, $1, $2, $3);
+ }
+ |
+ MethodType MethodDeclarator ';'
{
- $$ = 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));
+ $$ = add_method(genbind_ast, $1, $2, NULL);
}
+ ;
-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_IDENT, $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
- :
- Type
- |
+ClassArg
+ :
Private
|
Internal
|
- Interface
- |
Property
+ |
+ ClassFlag
+ |
+ Preface
+ |
+ Prologue
+ |
+ Epilogue
+ |
+ Postface
;
-Type
+
+Private
:
- TOK_TYPE TOK_IDENTIFIER ';'
+ TOK_PRIVATE TypeIdent ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_TYPE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
}
;
-Private
+Internal
:
- TOK_PRIVATE TOK_STRING_LITERAL TOK_IDENTIFIER ';'
+ TOK_INTERNAL 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_INTERNAL, NULL, $2);
}
;
-Internal
+ClassFlag
:
- TOK_INTERNAL TOK_STRING_LITERAL TOK_IDENTIFIER ';'
+ TOK_FLAGS ClassFlags ';'
{
- $$ = 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_FLAGS, NULL, $2);
}
;
-Interface
- :
- TOK_INTERFACE TOK_IDENTIFIER ';'
+ClassFlags
+ :
+ TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING_INTERFACE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $1);
+ }
+ |
+ ClassFlags ',' TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $3);
}
;
@@ -332,13 +499,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));
}
;