From b29ff13b599730bf3eaec8f142e584f23e78c1fb Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Tue, 27 Nov 2012 12:18:40 +0000 Subject: add type suffix annotations to webidl AST --- src/webidl-ast.c | 6 ++++++ src/webidl-ast.h | 3 +++ src/webidl-parser.y | 29 +++++++++++++++++++++++++---- 3 files changed, 34 insertions(+), 4 deletions(-) (limited to 'src') 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 UnsignedIntegerType %type IntegerType +%type TypeSuffix +%type TypeSuffixStartingWithArray + %type FloatLiteral %type BooleanLiteral %type 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] */ -- cgit v1.2.3