Some preliminary changes, to later improve widl error messages location, as well as compatibility with Windows SDK IDLs.
I'm not sure if the latter will be very useful, but it may be interesting to have.
From: Rémi Bernon rbernon@codeweavers.com
--- tools/widl/parser.y | 89 ++++++++++++++++++++++++++++++--------------- 1 file changed, 60 insertions(+), 29 deletions(-)
diff --git a/tools/widl/parser.y b/tools/widl/parser.y index c483eb06ff0..73ff249a993 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -366,9 +366,13 @@ input: gbl_statements m_acf { $1 = append_parameterized_type_stmts($1); } ;
-m_acf: /* empty */ | aACF acf_statements +m_acf + : %empty + | aACF acf_statements + ;
-decl_statements: { $$ = NULL; } +decl_statements + : %empty { $$ = NULL; } | decl_statements tINTERFACE qualified_type '<' parameterized_type_args '>' ';' { parameterized_type_stmts = append_statement(parameterized_type_stmts, make_statement_parameterized_type($3, $5)); $$ = append_statement($1, make_statement_reference(type_parameterized_type_specialize_declare($3, $5))); @@ -376,15 +380,18 @@ decl_statements: { $$ = NULL; } ;
decl_block: tDECLARE '{' decl_statements '}' { $$ = $3; } + ;
-imp_decl_statements: { $$ = NULL; } +imp_decl_statements + : %empty { $$ = NULL; } | imp_decl_statements tINTERFACE qualified_type '<' parameterized_type_args '>' ';' { $$ = append_statement($1, make_statement_reference(type_parameterized_type_specialize_declare($3, $5))); } ;
imp_decl_block: tDECLARE '{' imp_decl_statements '}' { $$ = $3; }
-gbl_statements: { $$ = NULL; } +gbl_statements + : %empty { $$ = NULL; } | gbl_statements namespacedef '{' { push_namespaces($2); } gbl_statements '}' { pop_namespaces($2); $$ = append_statements($1, $5); } | gbl_statements interface ';' { $$ = append_statement($1, make_statement_reference($2)); } @@ -409,7 +416,8 @@ gbl_statements: { $$ = NULL; } | gbl_statements decl_block { $$ = append_statements($1, $2); } ;
-imp_statements: { $$ = NULL; } +imp_statements + : %empty { $$ = NULL; } | imp_statements interface ';' { $$ = append_statement($1, make_statement_reference($2)); } | imp_statements dispinterface ';' { $$ = append_statement($1, make_statement_reference($2)); } | imp_statements namespacedef '{' { push_namespaces($2); } imp_statements '}' @@ -433,11 +441,13 @@ imp_statements: { $$ = NULL; } | imp_statements imp_decl_block { $$ = append_statements($1, $2); } ;
-int_statements: { $$ = NULL; } +int_statements + : %empty { $$ = NULL; } | int_statements statement { $$ = append_statement($1, $2); } ;
-semicolon_opt: +semicolon_opt + : %empty | ';' ;
@@ -512,7 +522,8 @@ librarydef: library_start imp_statements '}' semicolon_opt { $$ = $1; $$->stmts = $2; } ;
-m_args: { $$ = NULL; } +m_args + : %empty { $$ = NULL; } | args ;
@@ -545,7 +556,8 @@ array: '[' expr ']' { $$ = $2; | '[' ']' { $$ = make_expr(EXPR_VOID); } ;
-m_attributes: { $$ = NULL; } +m_attributes + : %empty { $$ = NULL; } | attributes ;
@@ -590,8 +602,10 @@ activatable_attr: $$ = make_exprt(EXPR_MEMBER, declare_var(NULL, $1, make_declarator(NULL), 0), $3); } | contract_req { $$ = $1; } /* activatable on the default activation factory */ + ;
-attribute: { $$ = NULL; } +attribute + : %empty { $$ = NULL; } | tACTIVATABLE '(' activatable_attr ')' { $$ = make_attrp(ATTR_ACTIVATABLE, $3); } | tAGGREGATABLE { $$ = make_attr(ATTR_AGGREGATABLE); } | tANNOTATION '(' aSTRING ')' { $$ = make_attrp(ATTR_ANNOTATION, $3); } @@ -723,7 +737,8 @@ callconv: tCDECL { $$ = xstrdup("__cdecl"); } | tSTDCALL { $$ = xstrdup("__stdcall"); } ;
-cases: { $$ = NULL; } +cases + : %empty { $$ = NULL; } | cases case { $$ = append_var( $1, $2 ); } ;
@@ -737,7 +752,8 @@ case: tCASE expr_int_const ':' union_field { attr_t *a = make_attrp(ATTR_CASE, } ;
-enums: { $$ = NULL; } +enums + : %empty { $$ = NULL; } | enum_list ',' { $$ = $1; } | enum_list ; @@ -779,7 +795,8 @@ m_exprs: m_expr { $$ = append_expr( NULL, $1 ); | m_exprs ',' m_expr { $$ = append_expr( $1, $3 ); } ;
-m_expr: { $$ = make_expr(EXPR_VOID); } +m_expr + : %empty { $$ = make_expr(EXPR_VOID); } | expr ;
@@ -844,7 +861,8 @@ expr_const: expr { $$ = $1; } ;
-fields: { $$ = NULL; } +fields + : %empty { $$ = NULL; } | fields field { $$ = append_var_list($1, $2); } ;
@@ -864,7 +882,8 @@ ne_union_field: | attributes ';' { $$ = make_var(NULL); $$->attrs = $1; } ;
-ne_union_fields: { $$ = NULL; } +ne_union_fields + : %empty { $$ = NULL; } | ne_union_fields ne_union_field { $$ = append_var( $1, $2 ); } ;
@@ -900,11 +919,13 @@ declaration: } ;
-m_ident: { $$ = NULL; } +m_ident + : %empty { $$ = NULL; } | ident ;
-m_typename: { $$ = NULL; } +m_typename + : %empty { $$ = NULL; } | typename ;
@@ -928,7 +949,8 @@ base_type: tBYTE { $$ = find_type_or_error(NULL, $<str>1); } | tHANDLET { $$ = find_type_or_error(NULL, $<str>1); } ;
-m_int: +m_int + : %empty | tINT ;
@@ -996,7 +1018,8 @@ namespacedef: tNAMESPACE aIDENTIFIER { $$ = append_str( NULL, $2 ); } | namespacedef '.' aIDENTIFIER { $$ = append_str( $1, $3 ); } ;
-class_interfaces: { $$ = NULL; } +class_interfaces + : %empty { $$ = NULL; } | class_interfaces class_interface { $$ = append_typeref( $1, $2 ); } ;
@@ -1026,7 +1049,8 @@ dispinterfacedef: { $$ = type_dispinterface_define_from_iface($2, $1, $4); } ;
-inherit: { $$ = NULL; } +inherit + : %empty { $$ = NULL; } | ':' qualified_type { $$ = $2; } | ':' parameterized_type { $$ = $2; } ; @@ -1062,8 +1086,10 @@ required_types: | parameterized_type { $$ = append_typeref(NULL, make_typeref($1)); } | required_types ',' qualified_type { $$ = append_typeref($1, make_typeref($3)); } | required_types ',' parameterized_type { $$ = append_typeref($1, make_typeref($3)); } + ;
-requires: { $$ = NULL; } +requires + : %empty { $$ = NULL; } | tREQUIRES required_types { $$ = $2; } ;
@@ -1114,7 +1140,8 @@ type_qualifier: tCONST { $$ = TYPE_QUALIFIER_CONST; } ;
-m_type_qual_list: { $$ = 0; } +m_type_qual_list + : %empty { $$ = 0; } | m_type_qual_list type_qualifier { $$ = $1 | $2; } ;
@@ -1129,7 +1156,8 @@ unqualified_decl_spec: unqualified_type m_decl_spec_no_type { $$ = make_decl_spec($2, $1, $3, STG_NONE, 0, 0); } ;
-m_decl_spec_no_type: { $$ = NULL; } +m_decl_spec_no_type + : %empty { $$ = NULL; } | decl_spec_no_type ;
@@ -1169,7 +1197,8 @@ abstract_declarator_no_direct: ;
/* abstract declarator or empty */ -m_abstract_declarator: { $$ = make_declarator(NULL); } +m_abstract_declarator + : %empty { $$ = make_declarator(NULL); } | abstract_declarator ;
@@ -1204,7 +1233,8 @@ any_declarator_no_direct: ;
/* abstract or non-abstract declarator or empty */ -m_any_declarator: { $$ = make_declarator(NULL); } +m_any_declarator + : %empty { $$ = make_declarator(NULL); } | any_declarator ;
@@ -1231,7 +1261,8 @@ declarator_list: | declarator_list ',' declarator { $$ = append_declarator( $1, $3 ); } ;
-m_bitfield: { $$ = NULL; } +m_bitfield + : %empty { $$ = NULL; } | ':' expr_const { $$ = $2; } ;
@@ -1310,12 +1341,12 @@ version: ;
acf_statements - : /* empty */ + : %empty | acf_interface acf_statements ;
acf_int_statements - : /* empty */ + : %empty | acf_int_statement acf_int_statements ;
@@ -1336,7 +1367,7 @@ acf_interface ;
acf_attributes - : /* empty */ { $$ = NULL; }; + : %empty { $$ = NULL; }; | '[' acf_attribute_list ']' { $$ = $2; }; ;
From: Rémi Bernon rbernon@codeweavers.com
--- tools/widl/parser.y | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 73ff249a993..92de47f106b 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -388,7 +388,9 @@ imp_decl_statements { $$ = append_statement($1, make_statement_reference(type_parameterized_type_specialize_declare($3, $5))); } ;
-imp_decl_block: tDECLARE '{' imp_decl_statements '}' { $$ = $3; } +imp_decl_block + : tDECLARE '{' imp_decl_statements '}' { $$ = $3; } + ;
gbl_statements : %empty { $$ = NULL; } @@ -585,16 +587,20 @@ contract_ver: | aNUM '.' aNUM { $$ = MAKEVERSION($3, $1); } ;
-contract_req: decl_spec ',' contract_ver { if ($1->type->type_type != TYPE_APICONTRACT) +contract_req + : decl_spec ',' contract_ver { if ($1->type->type_type != TYPE_APICONTRACT) error_loc("type %s is not an apicontract\n", $1->type->name); $$ = make_exprl(EXPR_NUM, $3); $$ = make_exprt(EXPR_GTREQL, declare_var(NULL, $1, make_declarator(NULL), 0), $$); } + ;
-static_attr: decl_spec ',' contract_req { if ($1->type->type_type != TYPE_INTERFACE) +static_attr + : decl_spec ',' contract_req { if ($1->type->type_type != TYPE_INTERFACE) error_loc("type %s is not an interface\n", $1->type->name); $$ = make_exprt(EXPR_MEMBER, declare_var(NULL, $1, make_declarator(NULL), 0), $3); } + ;
activatable_attr: decl_spec ',' contract_req { if ($1->type->type_type != TYPE_INTERFACE) @@ -1367,8 +1373,8 @@ acf_interface ;
acf_attributes - : %empty { $$ = NULL; }; - | '[' acf_attribute_list ']' { $$ = $2; }; + : %empty { $$ = NULL; } + | '[' acf_attribute_list ']' { $$ = $2; } ;
acf_attribute_list
From: Rémi Bernon rbernon@codeweavers.com
--- tools/widl/parser.l | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/tools/widl/parser.l b/tools/widl/parser.l index 8412ca7c64e..71ab2a0981f 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -20,6 +20,7 @@
%option stack %option noinput nounput noyy_top_state +%option noyywrap %option 8bit never-interactive prefix="parser_"
nl \r?\n @@ -232,13 +233,6 @@ SAFEARRAY{ws}*/( return tSAFEARRAY; } %%
-#ifndef parser_wrap -int parser_wrap(void) -{ - return 1; -} -#endif - struct keyword { const char *kw; int token;
From: Rémi Bernon rbernon@codeweavers.com
--- tools/widl/parser.h | 2 -- tools/widl/parser.l | 42 ++++++++++++++++++++++++------------------ tools/widl/parser.y | 11 +++++++++-- 3 files changed, 33 insertions(+), 22 deletions(-)
diff --git a/tools/widl/parser.h b/tools/widl/parser.h index bc0c50792e1..47bcf4bc5db 100644 --- a/tools/widl/parser.h +++ b/tools/widl/parser.h @@ -28,8 +28,6 @@ extern char *parser_text; extern int parser_debug; extern int yy_flex_debug;
-int parser_lex(void); - extern int import_stack_ptr; int do_import(char *fname); void abort_import(void); diff --git a/tools/widl/parser.l b/tools/widl/parser.l index 71ab2a0981f..6dab8ab256c 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -18,6 +18,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+%option bison-bridge %option stack %option noinput nounput noyy_top_state %option noyywrap @@ -59,6 +60,11 @@ double [0-9]+.[0-9]+([eE][+-]?[0-9]+)* #include "parser.h" #include "wpp_private.h"
+#define YYerror PARSER_error +#define YYSTYPE PARSER_STYPE +#define YYUNDEF PARSER_UNDEF +#define yyerror parser_error + #include "parser.tab.h"
static void addcchar(char c); @@ -68,8 +74,8 @@ static char *cbuffer; static int cbufidx; static int cbufalloc = 0;
-static int kw_token(const char *kw); -static int attr_token(const char *kw); +static int kw_token(const char *kw, YYSTYPE *yylval); +static int attr_token(const char *kw, YYSTYPE *yylval);
static void switch_to_acf(void);
@@ -162,24 +168,24 @@ struct uuid *parse_uuid(const char *u) } yy_pop_state(); } -<PP_PRAGMA>[^\n]* parser_lval.str = xstrdup(yytext); yy_pop_state(); return aPRAGMA; +<PP_PRAGMA>[^\n]* yylval->str = xstrdup(yytext); yy_pop_state(); return aPRAGMA; <INITIAL>^{ws}*midl_pragma{ws}+warning return tPRAGMA_WARNING; <INITIAL,ATTR>" yy_push_state(QUOTE); cbufidx = 0; <QUOTE>" { yy_pop_state(); - parser_lval.str = get_buffered_cstring(); + yylval->str = get_buffered_cstring(); return aSTRING; } <INITIAL,ATTR>L" yy_push_state(WSTRQUOTE); cbufidx = 0; <WSTRQUOTE>" { yy_pop_state(); - parser_lval.str = get_buffered_cstring(); + yylval->str = get_buffered_cstring(); return aWSTRING; } <INITIAL,ATTR>' yy_push_state(SQUOTE); cbufidx = 0; <SQUOTE>' { yy_pop_state(); - parser_lval.str = get_buffered_cstring(); + yylval->str = get_buffered_cstring(); return aSQSTRING; } <QUOTE,WSTRQUOTE,SQUOTE>\\ | @@ -189,25 +195,25 @@ struct uuid *parse_uuid(const char *u) <QUOTE,WSTRQUOTE,SQUOTE>. addcchar(yytext[0]); <INITIAL,ATTR>[ yy_push_state(ATTR); return '['; <ATTR>] yy_pop_state(); return ']'; -<ATTR>{cident} return attr_token(yytext); +<ATTR>{cident} return attr_token(yytext, yylval); <ATTR>{uuid} { - parser_lval.uuid = parse_uuid(yytext); + yylval->uuid = parse_uuid(yytext); return aUUID; } <INITIAL,ATTR>{hex} { - parser_lval.num = xstrtoul(yytext, NULL, 0); + yylval->num = xstrtoul(yytext, NULL, 0); return aHEXNUM; } <INITIAL,ATTR>{int} { - parser_lval.num = xstrtoul(yytext, NULL, 0); + yylval->num = xstrtoul(yytext, NULL, 0); return aNUM; } <INITIAL>{double} { - parser_lval.dbl = strtod(yytext, NULL); + yylval->dbl = strtod(yytext, NULL); return aDOUBLE; } SAFEARRAY{ws}*/( return tSAFEARRAY; -{cident} return kw_token(yytext); +{cident} return kw_token(yytext, yylval); <INITIAL,ATTR>\n line_number++; <INITIAL,ATTR>{ws} <INITIAL,ATTR><< return SHL; @@ -452,30 +458,30 @@ static int kw_cmp_func(const void *s1, const void *s2) return strcmp(KWP(s1)->kw, KWP(s2)->kw); }
-static int kw_token(const char *kw) +static int kw_token(const char *kw, YYSTYPE *yylval) { struct keyword key, *kwp; key.kw = kw; kwp = bsearch(&key, keywords, NKEYWORDS, sizeof(keywords[0]), kw_cmp_func); if (kwp && (!kwp->winrt_only || winrt_mode)) { - parser_lval.str = xstrdup(kwp->kw); + yylval->str = xstrdup(kwp->kw); return kwp->token; } - parser_lval.str = xstrdup(kw); + yylval->str = xstrdup(kw); return is_type(kw) ? aKNOWNTYPE : aIDENTIFIER; }
-static int attr_token(const char *kw) +static int attr_token(const char *kw, YYSTYPE *yylval) { struct keyword key, *kwp; key.kw = kw; kwp = bsearch(&key, attr_keywords, sizeof(attr_keywords)/sizeof(attr_keywords[0]), sizeof(attr_keywords[0]), kw_cmp_func); if (kwp && (!kwp->winrt_only || winrt_mode)) { - parser_lval.str = xstrdup(kwp->kw); + yylval->str = xstrdup(kwp->kw); return kwp->token; } - return kw_token(kw); + return kw_token(kw, yylval); }
static void addcchar(char c) diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 92de47f106b..6777a281ec7 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -121,7 +121,16 @@ static typelib_t *current_typelib;
%}
+%code provides +{ + +int parser_lex( PARSER_STYPE *yylval ); + +} + %define api.prefix {parser_} +%define api.pure full +%define parse.error verbose
%union { attr_t *attr; @@ -347,8 +356,6 @@ static typelib_t *current_typelib; %right '!' '~' CAST PPTR POS NEG ADDRESSOF tSIZEOF %left '.' MEMBERPTR '[' ']'
-%define parse.error verbose - %%
input: gbl_statements m_acf { $1 = append_parameterized_type_stmts($1);
From: Rémi Bernon rbernon@codeweavers.com
--- tools/widl/parser.h | 1 - tools/widl/parser.l | 9 --------- tools/widl/widl.c | 1 - 3 files changed, 11 deletions(-)
diff --git a/tools/widl/parser.h b/tools/widl/parser.h index 47bcf4bc5db..83832ecfcd8 100644 --- a/tools/widl/parser.h +++ b/tools/widl/parser.h @@ -30,7 +30,6 @@ extern int yy_flex_debug;
extern int import_stack_ptr; int do_import(char *fname); -void abort_import(void); void pop_import(void);
#define parse_only import_stack_ptr diff --git a/tools/widl/parser.l b/tools/widl/parser.l index 6dab8ab256c..85d33d6e86a 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -86,7 +86,6 @@ struct { YY_BUFFER_STATE state; char *input_name; int line_number; - char *temp_name; } import_stack[MAX_IMPORT_DEPTH]; int import_stack_ptr = 0;
@@ -569,14 +568,6 @@ int do_import(char *fname) return 1; }
-void abort_import(void) -{ - int ptr; - - for (ptr=0; ptr<import_stack_ptr; ptr++) - unlink(import_stack[ptr].temp_name); -} - static void switch_to_acf(void) { int ptr = import_stack_ptr; diff --git a/tools/widl/widl.c b/tools/widl/widl.c index 7d3fa26f8d0..1bc52a2a3a2 100644 --- a/tools/widl/widl.c +++ b/tools/widl/widl.c @@ -886,7 +886,6 @@ int main(int argc,char *argv[])
static void rm_tempfile(void) { - abort_import(); if (do_header) unlink(header_name); if (local_stubs_name)
This merge request was approved by Jacek Caban.