[PATCH vkd3d 2/5] vkd3d-shader: Implement unary operators.

Zebediah Figura zfigura at codeweavers.com
Mon Jan 18 15:16:41 CST 2021


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 libs/vkd3d-shader/preproc.l |  2 +-
 libs/vkd3d-shader/preproc.y | 36 ++++++++++++++++++++++++++++++++----
 2 files changed, 33 insertions(+), 5 deletions(-)

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_]*
     }
 
 <INITIAL>{WS}+                      {}
-<INITIAL>[()\[\]{},]                {return yytext[0];}
+<INITIAL>[-()\[\]{},+!]             {return yytext[0];}
 <INITIAL>.                          {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 <integer> expr
+%type <integer> primary_expr
+%type <integer> unary_expr
 %type <string> body_token
 %type <const_string> body_token_const
 %type <string_buffer> 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;
+        }
-- 
2.30.0




More information about the wine-devel mailing list