Kai Tietz : widl: Add RT's namespace keyword to scanner, and parser.

Alexandre Julliard julliard at winehq.org
Mon Aug 19 14:32:59 CDT 2013


Module: wine
Branch: master
Commit: 499f05433a3d2fc197dfe654f3cea951898d8754
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=499f05433a3d2fc197dfe654f3cea951898d8754

Author: Kai Tietz <ktietz70 at googlemail.com>
Date:   Thu Aug  8 15:45:24 2013 +0200

widl: Add RT's namespace keyword to scanner, and parser.

---

 tools/widl/parser.l |    3 ++-
 tools/widl/parser.y |   18 ++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/tools/widl/parser.l b/tools/widl/parser.l
index e806167..fb61e21 100644
--- a/tools/widl/parser.l
+++ b/tools/widl/parser.l
@@ -261,6 +261,7 @@ static const struct keyword keywords[] = {
 	{"long",			tLONG},
 	{"methods",			tMETHODS},
 	{"module",			tMODULE},
+	{"namespace",			tNAMESPACE},
 	{"pascal",			tPASCAL},
 	{"properties",			tPROPERTIES},
 	{"register",			tREGISTER},
@@ -414,7 +415,7 @@ static int kw_token(const char *kw)
 	struct keyword key, *kwp;
 	key.kw = kw;
 	kwp = bsearch(&key, keywords, NKEYWORDS, sizeof(keywords[0]), kw_cmp_func);
-	if (kwp) {
+	if (kwp && (do_rt_extension || kwp->token != tNAMESPACE)) {
 		parser_lval.str = xstrdup(kwp->kw);
 		return kwp->token;
 	}
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 579cbc6..0b5ebe6 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -121,6 +121,7 @@ static statement_t *make_statement_typedef(var_list_t *names);
 static statement_t *make_statement_import(const char *str);
 static statement_t *make_statement_typedef(var_list_t *names);
 static statement_list_t *append_statement(statement_list_t *list, statement_t *stmt);
+static statement_list_t *append_statements(statement_list_t *, statement_list_t *);
 
 %}
 %union {
@@ -202,6 +203,7 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s
 %token tMAYBE tMESSAGE
 %token tMETHODS
 %token tMODULE
+%token tNAMESPACE
 %token tNOCODE tNONBROWSABLE
 %token tNONCREATABLE
 %token tNONEXTENSIBLE
@@ -258,6 +260,7 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s
 %type <type> inherit interface interfacedef interfacedec
 %type <type> dispinterface dispinterfacehdr dispinterfacedef
 %type <type> module modulehdr moduledef
+%type <type> namespacedef
 %type <type> base_type int_std
 %type <type> enumdef structdef uniondef typedecl
 %type <type> type
@@ -315,6 +318,8 @@ input:   gbl_statements				{ fix_incomplete();
 	;
 
 gbl_statements:					{ $$ = NULL; }
+	| gbl_statements namespacedef '{' gbl_statements '}'
+						{ $$ = append_statements($1, $4); }
 	| gbl_statements interfacedec		{ $$ = append_statement($1, make_statement_reference($2)); }
 	| gbl_statements interfacedef		{ $$ = append_statement($1, make_statement_type_decl($2)); }
 	| gbl_statements coclass ';'		{ $$ = $1;
@@ -330,6 +335,8 @@ gbl_statements:					{ $$ = NULL; }
 
 imp_statements:					{ $$ = NULL; }
 	| imp_statements interfacedec		{ $$ = append_statement($1, make_statement_reference($2)); }
+	| imp_statements namespacedef '{' imp_statements '}'
+						{ $$ = append_statements($1, $4); }
 	| imp_statements interfacedef		{ $$ = append_statement($1, make_statement_type_decl($2)); }
 	| imp_statements coclass ';'		{ $$ = $1; reg_type($2, $2->name, 0); }
 	| imp_statements coclassdef		{ $$ = append_statement($1, make_statement_type_decl($2));
@@ -801,6 +808,9 @@ coclassdef: coclasshdr '{' coclass_ints '}' semicolon_opt
 						{ $$ = type_coclass_define($1, $3); }
 	;
 
+namespacedef: tNAMESPACE aIDENTIFIER		{ $$ = NULL; }
+	;
+
 coclass_ints:					{ $$ = NULL; }
 	| coclass_ints coclass_int		{ $$ = append_ifref( $1, $2 ); }
 	;
@@ -2784,6 +2794,14 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
     return stmt;
 }
 
+static statement_list_t *append_statements(statement_list_t *l1, statement_list_t *l2)
+{
+    if (!l2) return l1;
+    if (!l1 || l1 == l2) return l2;
+    list_move_tail (l1, l2);
+    return l1;
+}
+
 static statement_list_t *append_statement(statement_list_t *list, statement_t *stmt)
 {
     if (!stmt) return list;




More information about the wine-cvs mailing list