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.y172
1 files changed, 76 insertions, 96 deletions
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index b883833..247a047 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -80,7 +80,6 @@ add_method(struct genbind_node **genbind_ast,
genbind_new_node(GENBIND_NODE_TYPE_IDENT,
method_node,
class_name));
-
} else {
/* update the existing class */
@@ -156,21 +155,14 @@ add_method(struct genbind_node **genbind_ast,
%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 <value> BindingAndMethodType
%type <node> WebIDL
-%type <node> Preface
-%type <node> Prologue
-%type <node> Epilogue
-%type <node> Postface
-%type <node> Private
-%type <node> Internal
-%type <node> Property
%type <node> ParameterList
%type <node> CTypeIdent
@@ -188,7 +180,7 @@ Input:
Statements:
Statement
- |
+ |
Statements Statement
{
$$ = *genbind_ast = genbind_node_prepend($2, $1);
@@ -225,23 +217,26 @@ BindingArgs:
|
BindingArgs BindingArg
{
- $$ = genbind_node_link($2, $1);
+ $$ = genbind_node_link($2, $1);
}
;
BindingArg:
WebIDL
|
- Preface
- |
- Prologue
- |
- Epilogue
- |
- Postface
+ BindingAndMethodType CBlock ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
+ genbind_new_node(GENBIND_NODE_TYPE_CDATA,
+ NULL,
+ $2),
+ (void *)$1));
+ }
;
- /* a web IDL file specifier */
+/* a web IDL file specifier */
WebIDL:
TOK_WEBIDL TOK_STRING_LITERAL ';'
{
@@ -308,40 +303,42 @@ CTypeIdent:
}
;
-Preface:
- TOK_PREFACE CBlock ';'
+
+CBlock:
+ TOK_CCODE_LITERAL
+ |
+ CBlock TOK_CCODE_LITERAL
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PREFACE, NULL, $2);
+ $$ = genbind_strapp($1, $2);
}
;
-Prologue:
- TOK_PROLOGUE CBlock ';'
+
+ParameterList:
+ CTypeIdent
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PROLOGUE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1);
}
- ;
-
-Epilogue:
- TOK_EPILOGUE CBlock ';'
+ |
+ ParameterList ',' CTypeIdent
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_EPILOGUE, NULL, $2);
+ $$ = genbind_node_prepend($1,
+ genbind_new_node(
+ GENBIND_NODE_TYPE_PARAMETER,
+ NULL,
+ $3));
}
;
-Postface:
- TOK_POSTFACE CBlock ';'
+Method:
+ MethodType MethodDeclarator CBlock
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_POSTFACE, NULL, $2);
+ $$ = add_method(genbind_ast, $1, $2, $3);
}
- ;
-
-CBlock:
- TOK_CCODE_LITERAL
|
- CBlock TOK_CCODE_LITERAL
+ MethodType MethodDeclarator ';'
{
- $$ = genbind_strapp($1, $2);
+ $$ = add_method(genbind_ast, $1, $2, NULL);
}
;
@@ -375,21 +372,29 @@ MethodType:
{
$$ = GENBIND_METHOD_TYPE_PROTOTYPE;
}
+ |
+ BindingAndMethodType
;
-ParameterList:
- CTypeIdent
+BindingAndMethodType:
+ TOK_PREFACE
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1);
+ $$ = GENBIND_METHOD_TYPE_PREFACE;
}
|
- ParameterList ',' CTypeIdent
+ TOK_PROLOGUE
{
- $$ = genbind_node_prepend($1,
- genbind_new_node(
- GENBIND_NODE_TYPE_PARAMETER,
- NULL,
- $3));
+ $$ = GENBIND_METHOD_TYPE_PROLOGUE;
+ }
+ |
+ TOK_EPILOGUE
+ {
+ $$ = GENBIND_METHOD_TYPE_EPILOGUE;
+ }
+ |
+ TOK_POSTFACE
+ {
+ $$ = GENBIND_METHOD_TYPE_POSTFACE;
}
;
@@ -434,17 +439,6 @@ MethodDeclarator:
}
;
-Method:
- MethodType MethodDeclarator CBlock
- {
- $$ = add_method(genbind_ast, $1, $2, $3);
- }
- |
- MethodType MethodDeclarator ';'
- {
- $$ = add_method(genbind_ast, $1, $2, NULL);
- }
- ;
Class:
TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}' ';'
@@ -464,43 +458,41 @@ ClassArgs:
;
ClassArg:
- Private
- |
- Internal
- |
- Property
- |
- ClassFlag
- |
- Preface
- |
- Prologue
- |
- Epilogue
- |
- Postface
- ;
-
-
-Private:
TOK_PRIVATE CTypeIdent ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
}
- ;
-
-Internal:
+ |
TOK_INTERNAL CTypeIdent ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2);
}
- ;
-
-ClassFlag:
+ |
+ TOK_PROPERTY Modifiers TOK_IDENTIFIER ';'
+ {
+ $$ = 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));
+ }
+ |
TOK_FLAGS ClassFlags ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2);
}
+ |
+ BindingAndMethodType CBlock ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
+ genbind_new_node(GENBIND_NODE_TYPE_CDATA,
+ NULL,
+ $2),
+ (void *)$1));
+ }
;
ClassFlags:
@@ -515,18 +507,6 @@ ClassFlags:
}
;
-Property:
- TOK_PROPERTY Modifiers TOK_IDENTIFIER ';'
- {
- $$ = 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));
- }
- ;
-
Modifiers:
/* empty */
{