summaryrefslogtreecommitdiff
path: root/src/nsgenbind-parser.y
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2015-07-21 23:48:45 +0100
committerVincent Sanders <vince@kyllikki.org>2015-07-21 23:48:45 +0100
commit1288d8c535edd2ce29eebdc4acca6b2beab89841 (patch)
tree162bd2d090e03a7ffb9523797c1dd2aebbce236f /src/nsgenbind-parser.y
parent94137186a3e2270e9b96f243a82a77a590c17f01 (diff)
downloadnsgenbind-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.y386
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));
}
;