diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l index 95b043ed..011f8dbb 100644 --- a/libs/vkd3d-shader/preproc.l +++ b/libs/vkd3d-shader/preproc.l @@ -157,7 +157,7 @@ IDENTIFIER [A-Za-z_][A-Za-z0-9_]* } {WS}+ {} -[()\[\]{},] {return yytext[0];} +[-()\[\]{},+!] {return yytext[0];} . {return T_TEXT;} %% diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y index 008d01e7..51df5d40 100644 --- a/libs/vkd3d-shader/preproc.y +++ b/libs/vkd3d-shader/preproc.y @@ -333,7 +333,8 @@ static void free_parse_arg_names(struct parse_arg_names *args) %token T_CONCAT "##" %token T_DEFINED "defined" -%type expr +%type primary_expr +%type unary_expr %type body_token %type body_token_const %type body_text @@ -426,6 +427,18 @@ body_token_const { $$ = ","; } + | '+' + { + $$ = "+"; + } + | '-' + { + $$ = "-"; + } + | '!' + { + $$ = "!"; + } | T_CONCAT { $$ = "##"; @@ -467,7 +480,7 @@ directive } vkd3d_free($2); } - | T_IF expr T_NEWLINE + | T_IF unary_expr T_NEWLINE { if (!preproc_push_if(ctx, !!$2)) YYABORT; @@ -482,7 +495,7 @@ directive preproc_push_if(ctx, !preproc_find_macro(ctx, $2)); vkd3d_free($2); } - | T_ELIF expr T_NEWLINE + | T_ELIF unary_expr T_NEWLINE { const struct preproc_file *file = preproc_get_top_file(ctx); @@ -582,7 +595,7 @@ directive vkd3d_free($2); } -expr +primary_expr : T_INTEGER { $$ = preproc_parse_integer($1); @@ -603,3 +616,18 @@ expr $$ = !!preproc_find_macro(ctx, $3); vkd3d_free($3); } + +unary_expr + : primary_expr + | '+' unary_expr + { + $$ = $2; + } + | '-' unary_expr + { + $$ = -$2; + } + | '!' unary_expr + { + $$ = !$2; + }