diff options
author | Vincent Sanders <vincent.sanders@collabora.co.uk> | 2012-11-27 12:18:40 +0000 |
---|---|---|
committer | Vincent Sanders <vincent.sanders@collabora.co.uk> | 2012-11-27 12:18:40 +0000 |
commit | b29ff13b599730bf3eaec8f142e584f23e78c1fb (patch) | |
tree | 5689c409360e1a95afe2856ae7925455e00e57fc | |
parent | 6f54ba5f6a2008191c2bb3435f8015ae70bcf156 (diff) | |
download | nsgenbind-b29ff13b599730bf3eaec8f142e584f23e78c1fb.tar.gz nsgenbind-b29ff13b599730bf3eaec8f142e584f23e78c1fb.tar.bz2 |
add type suffix annotations to webidl AST
-rw-r--r-- | src/webidl-ast.c | 6 | ||||
-rw-r--r-- | src/webidl-ast.h | 3 | ||||
-rw-r--r-- | src/webidl-parser.y | 29 |
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] */ |