summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/webidl-ast.c6
-rw-r--r--src/webidl-ast.h3
-rw-r--r--src/webidl-parser.y29
3 files changed, 34 insertions, 4 deletions
diff --git a/src/webidl-ast.c b/src/webidl-ast.c
index ba9d44f..7957f02 100644
--- a/src/webidl-ast.c
+++ b/src/webidl-ast.c
@@ -317,6 +317,12 @@ static const char *webidl_node_type_to_str(enum webidl_node_type type)
case WEBIDL_NODE_TYPE_TYPE_BASE:
return "Base";
+ case WEBIDL_NODE_TYPE_TYPE_NULLABLE:
+ return "Nullable";
+
+ case WEBIDL_NODE_TYPE_TYPE_ARRAY:
+ return "Array";
+
case WEBIDL_NODE_TYPE_MODIFIER:
return "Modifier";
diff --git a/src/webidl-ast.h b/src/webidl-ast.h
index 5d7c615..aa791ca 100644
--- a/src/webidl-ast.h
+++ b/src/webidl-ast.h
@@ -32,6 +32,9 @@ enum webidl_node_type {
WEBIDL_NODE_TYPE_ELLIPSIS,
WEBIDL_NODE_TYPE_TYPE,
WEBIDL_NODE_TYPE_TYPE_BASE,
+ WEBIDL_NODE_TYPE_TYPE_NULLABLE,
+ WEBIDL_NODE_TYPE_TYPE_ARRAY,
+
WEBIDL_NODE_TYPE_LITERAL_NULL,
WEBIDL_NODE_TYPE_LITERAL_INT,
WEBIDL_NODE_TYPE_LITERAL_BOOL,
diff --git a/src/webidl-parser.y b/src/webidl-parser.y
index f719110..bf79e8f 100644
--- a/src/webidl-parser.y
+++ b/src/webidl-parser.y
@@ -163,6 +163,9 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const char *str)
%type <node> UnsignedIntegerType
%type <node> IntegerType
+%type <node> TypeSuffix
+%type <node> TypeSuffixStartingWithArray
+
%type <node> FloatLiteral
%type <node> BooleanLiteral
%type <node> ConstValue
@@ -1099,16 +1102,19 @@ UnionMemberTypes:
/* [62] */
NonAnyType:
PrimitiveType TypeSuffix
+ {
+ $$ = webidl_node_prepend($1, $2);
+ }
|
TOK_STRING TypeSuffix
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_STRING);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, $2, (void *)WEBIDL_TYPE_STRING);
}
|
TOK_IDENTIFIER TypeSuffix
{
struct webidl_node *type;
- type = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_USER);
+ type = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, $2, (void *)WEBIDL_TYPE_USER);
$$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, type, $1);
}
|
@@ -1119,12 +1125,12 @@ NonAnyType:
|
TOK_OBJECT TypeSuffix
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_OBJECT);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, $2, (void *)WEBIDL_TYPE_OBJECT);
}
|
TOK_DATE TypeSuffix
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_DATE);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, $2, (void *)WEBIDL_TYPE_DATE);
}
;
@@ -1237,17 +1243,32 @@ OptionalLong:
/* [70] */
TypeSuffix:
/* empty */
+ {
+ $$ = NULL;
+ }
|
'[' ']' TypeSuffix
+ {
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_ARRAY, $3, NULL);
+ }
|
'?' TypeSuffixStartingWithArray
+ {
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_NULLABLE, $2, NULL);
+ }
;
/* [71] */
TypeSuffixStartingWithArray:
/* empty */
+ {
+ $$ = NULL;
+ }
|
'[' ']' TypeSuffix
+ {
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_ARRAY, $3, NULL);
+ }
;
/* [72] */