summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2015-09-30 23:16:58 +0100
committerVincent Sanders <vince@kyllikki.org>2015-09-30 23:16:58 +0100
commitf9dacddfe39ba67a70890b2bde2e3ddb8d1b0705 (patch)
tree52b6ea46181cab6c030d86f52a4353aaeb3f73fb /src
parentac6ae0a7b545dbf3391760cfe9e6b86ce0c579db (diff)
downloadnsgenbind-f9dacddfe39ba67a70890b2bde2e3ddb8d1b0705.tar.gz
nsgenbind-f9dacddfe39ba67a70890b2bde2e3ddb8d1b0705.tar.bz2
Process extended attributes for constructors
Extended attributes for constructors and named constructors are now parsed into the AST as operations ready to be used to generate output.
Diffstat (limited to 'src')
-rw-r--r--src/webidl-lexer.l4
-rw-r--r--src/webidl-parser.y265
2 files changed, 168 insertions, 101 deletions
diff --git a/src/webidl-lexer.l b/src/webidl-lexer.l
index 4788610..a857654 100644
--- a/src/webidl-lexer.l
+++ b/src/webidl-lexer.l
@@ -215,6 +215,10 @@ legacyiterable return TOK_LEGACYITERABLE;
required return TOK_REQUIRED;
+Constructor return TOK_CONSTRUCTOR;
+
+NamedConstructor return TOK_NAMEDCONSTRUCTOR;
+
{identifier} {
/* A leading "_" is used to escape an identifier from
* looking like a reserved word terminal. */
diff --git a/src/webidl-parser.y b/src/webidl-parser.y
index 406962f..b48b449 100644
--- a/src/webidl-parser.y
+++ b/src/webidl-parser.y
@@ -67,6 +67,7 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const char *str)
%token TOK_BYTE
%token TOK_CALLBACK
%token TOK_CONST
+%token TOK_CONSTRUCTOR
%token TOK_CREATOR
%token TOK_DATE
%token TOK_DELETER
@@ -92,6 +93,7 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const char *str)
%token TOK_MODULE
%token TOK_NAN
%token TOK_NATIVE
+%token TOK_NAMEDCONSTRUCTOR
%token TOK_NULL_LITERAL
%token TOK_OBJECT
%token TOK_OCTET
@@ -580,12 +582,12 @@ PartialDictionary:
Default:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'=' DefaultValue
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -619,12 +621,12 @@ ExceptionMembers:
Inheritance:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
':' TOK_IDENTIFIER
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -632,7 +634,7 @@ Inheritance:
Enum:
TOK_ENUM TOK_IDENTIFIER '{' EnumValueList '}' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -662,7 +664,7 @@ EnumValueListString:
CallbackRest:
TOK_IDENTIFIER '=' ReturnType '(' ArgumentList ')' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -670,7 +672,7 @@ CallbackRest:
Typedef:
TOK_TYPEDEF ExtendedAttributeList Type TOK_IDENTIFIER ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -732,12 +734,14 @@ ConstValue:
|
TOK_INT_LITERAL
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_INT, NULL, (void *)$1);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_INT,
+ NULL,
+ (void *)$1);
}
|
TOK_NULL_LITERAL
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_NULL, NULL, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_NULL, NULL, NULL);
}
;
@@ -745,12 +749,16 @@ ConstValue:
BooleanLiteral:
TOK_TRUE
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL, NULL, (void *)true);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL,
+ NULL,
+ (void *)true);
}
|
TOK_FALSE
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL, NULL, (void *)false);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL,
+ NULL,
+ (void *)false);
}
;
@@ -758,34 +766,42 @@ BooleanLiteral:
FloatLiteral:
TOK_FLOAT_LITERAL
{
- float *value;
- value = malloc(sizeof(float));
- *value = strtof($1, NULL);
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = strtof($1, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
'-' TOK_INFINITY
{
- float *value;
- value = malloc(sizeof(float));
- *value = -INFINITY;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = -INFINITY;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
TOK_INFINITY
{
- float *value;
- value = malloc(sizeof(float));
- *value = INFINITY;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = INFINITY;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
TOK_NAN
{
- float *value;
- value = malloc(sizeof(float));
- *value = NAN;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = NAN;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
;
@@ -793,7 +809,7 @@ FloatLiteral:
AttributeOrOperation:
TOK_STRINGIFIER StringifierAttributeOrOperation
{
- $$ = $2;
+ $$ = $2;
}
|
Attribute
@@ -807,13 +823,13 @@ StringifierAttributeOrOperation:
|
OperationRest
{
- /* @todo deal with stringifier */
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION, NULL, $1);
+ /* @todo deal with stringifier */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION, NULL, $1);
}
|
';'
{
- $$=NULL;
+ $$=NULL;
}
;
@@ -915,7 +931,7 @@ AttributeName:
AttributeNameKeyword:
TOK_REQUIRED
{
- $$ = strdup("required");
+ $$ = strdup("required");
}
/* [33]
@@ -924,12 +940,12 @@ AttributeNameKeyword:
Inherit:
/* empty */
{
- $$ = false;
+ $$ = false;
}
|
TOK_INHERIT
{
- $$ = true;
+ $$ = true;
}
;
@@ -940,12 +956,12 @@ Inherit:
ReadOnly:
/* empty */
{
- $$ = false;
+ $$ = false;
}
|
TOK_READONLY
{
- $$ = true;
+ $$ = true;
}
;
@@ -999,34 +1015,39 @@ Special:
TOK_GETTER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_GETTER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_GETTER);
}
|
TOK_SETTER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_SETTER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_SETTER);
}
|
TOK_CREATOR
{
- /* second edition removed this special but teh
- specifications still use it!
- */
+ /* second edition removed this special but the
+ * specifications still use it!
+ */
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_CREATOR);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_CREATOR);
}
|
TOK_DELETER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_DELETER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_DELETER);
}
|
TOK_LEGACYCALLER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_LEGACYCALLER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_LEGACYCALLER);
}
;
@@ -1034,10 +1055,10 @@ Special:
OperationRest:
OptionalIdentifier '(' ArgumentList ')' ';'
{
- /* argument list */
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LIST, NULL, $3);
+ /* argument list */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LIST, NULL, $3);
- $$ = webidl_node_prepend($1, $$); /* identifier */
+ $$ = webidl_node_prepend($1, $$); /* identifier */
}
;
@@ -1045,12 +1066,12 @@ OperationRest:
OptionalIdentifier:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_IDENTIFIER
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1);
}
;
@@ -1061,12 +1082,12 @@ OptionalIdentifier:
ArgumentList:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
Argument Arguments
{
- $$ = webidl_node_append($2, $1);
+ $$ = webidl_node_append($2, $1);
}
;
@@ -1074,12 +1095,12 @@ ArgumentList:
Arguments:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' Argument Arguments
{
- $$ = webidl_node_append($3, $2);
+ $$ = webidl_node_append($3, $2);
}
;
@@ -1088,7 +1109,7 @@ Arguments:
Argument:
ExtendedAttributeList OptionalOrRequiredArgument
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -1124,12 +1145,12 @@ ArgumentName:
Ellipsis:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_ELLIPSIS
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_ELLIPSIS, NULL, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_ELLIPSIS, NULL, NULL);
}
;
@@ -1137,12 +1158,12 @@ Ellipsis:
Iterable:
TOK_ITERABLE '<' Type OptionalType '>' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_LEGACYITERABLE '<' Type '>' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -1150,12 +1171,12 @@ Iterable:
OptionalType:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' Type
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -1175,12 +1196,14 @@ ExceptionField:
ExtendedAttributeList:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'[' ExtendedAttribute ExtendedAttributes ']'
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $3, $2);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ $3,
+ $2);
}
;
@@ -1188,12 +1211,14 @@ ExtendedAttributeList:
ExtendedAttributes:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' ExtendedAttribute ExtendedAttributes
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $3, $2);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ $3,
+ $2);
}
;
@@ -1218,10 +1243,46 @@ ExtendedAttribute:
$$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $4, $2);
}
|
+ TOK_CONSTRUCTOR
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ strdup("Constructor"));
+ }
+ |
+ TOK_CONSTRUCTOR '(' ArgumentList ')'
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ strdup("Constructor")),
+ webidl_node_new(WEBIDL_NODE_TYPE_LIST,
+ NULL,
+ $3));
+ }
+ |
+ TOK_NAMEDCONSTRUCTOR '=' TOK_IDENTIFIER '(' ArgumentList ')'
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ strdup("NamedConstructor")),
+ webidl_node_new(WEBIDL_NODE_TYPE_LIST,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $3),
+ $5));
+ }
+ |
Other ExtendedAttributeRest
{
- $$ = webidl_node_append($2,
- webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1));
+ $$ = webidl_node_append($2,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $1));
}
;
@@ -1229,12 +1290,12 @@ ExtendedAttribute:
ExtendedAttributeRest:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
ExtendedAttribute
{
- $$ = $1;
+ $$ = $1;
}
;
@@ -1242,16 +1303,16 @@ ExtendedAttributeRest:
ExtendedAttributeInner:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'(' ExtendedAttributeInner ')' ExtendedAttributeInner
{
- $$ = webidl_node_prepend(
- webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
- NULL,
- $2),
- $4);
+ $$ = webidl_node_prepend(
+ webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ NULL,
+ $2),
+ $4);
}
|
'[' ExtendedAttributeInner ']' ExtendedAttributeInner
@@ -1276,8 +1337,10 @@ ExtendedAttributeInner:
|
OtherOrComma ExtendedAttributeInner
{
- $$ = webidl_node_append($2,
- webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1));
+ $$ = webidl_node_append($2,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $1));
}
;
@@ -1285,119 +1348,119 @@ ExtendedAttributeInner:
Other:
TOK_INT_LITERAL
{
- /* @todo loosing base info here might break the attribute */
- $$ = calloc(1, 32);
- snprintf($$, 32, "%ld", $1);
+ /* @todo loosing base info here might break the attribute */
+ $$ = calloc(1, 32);
+ snprintf($$, 32, "%ld", $1);
}
|
TOK_FLOAT_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_IDENTIFIER
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_STRING_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_OTHER_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
'-'
{
- $$ = strdup("-");
+ $$ = strdup("-");
}
|
'.'
{
- $$ = strdup(".");
+ $$ = strdup(".");
}
|
TOK_ELLIPSIS
{
- $$ = strdup("...");
+ $$ = strdup("...");
}
|
':'
{
- $$ = strdup(":");
+ $$ = strdup(":");
}
|
';'
{
- $$ = strdup(";");
+ $$ = strdup(";");
}
|
'<'
{
- $$ = strdup("<");
+ $$ = strdup("<");
}
|
'='
{
- $$ = strdup("=");
+ $$ = strdup("=");
}
|
'>'
{
- $$ = strdup(">");
+ $$ = strdup(">");
}
|
'?'
{
- $$ = strdup("?");
+ $$ = strdup("?");
}
|
TOK_DATE
{
- $$ = strdup("Date");
+ $$ = strdup("Date");
}
|
TOK_STRING
{
- $$ = strdup("DOMString");
+ $$ = strdup("DOMString");
}
|
TOK_INFINITY
{
- $$ = strdup("Infinity");
+ $$ = strdup("Infinity");
}
|
TOK_NAN
{
- $$ = strdup("NaN");
+ $$ = strdup("NaN");
}
|
TOK_ANY
{
- $$ = strdup("any");
+ $$ = strdup("any");
}
|
TOK_BOOLEAN
{
- $$ = strdup("boolean");
+ $$ = strdup("boolean");
}
|
TOK_BYTE
{
- $$ = strdup("byte");
+ $$ = strdup("byte");
}
|
TOK_DOUBLE
{
- $$ = strdup("double");
+ $$ = strdup("double");
}
|
TOK_FALSE
{
- $$ = strdup("false");
+ $$ = strdup("false");
}
|
TOK_FLOAT