add support for C conditional operator
authorJacob Lifshay <programmerjake@gmail.com>
Tue, 25 Jul 2023 01:42:27 +0000 (18:42 -0700)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 22 Dec 2023 19:26:20 +0000 (19:26 +0000)
its used by setbc's pseudocode and by the bfp_* functions

src/openpower/decoder/pseudo/lexer.py
src/openpower/decoder/pseudo/parser.py

index 339a1980315663c63b41efa6cd103d33cadf0463..b454b2ac61084d8e11318c873faab6aebefbe403 100644 (file)
@@ -363,6 +363,7 @@ class PowerLexer:
         'WS',
         'NEWLINE',
         'COMMA',
+        'QMARK',
         'PERIOD',
         'SEMICOLON',
         'INDENT',
@@ -424,6 +425,7 @@ class PowerLexer:
     t_BITOR = r'\|'
     t_BITAND = r'\&'
     t_BITXOR = r'\^'
+    t_QMARK = r'\?'
 
     # Ply nicely documented how to do this.
 
index a8ab32cbe8d2e06e84ed72fb0329d8b57020c682..a409d86a6ee70d47cc09fc7f2f4775de3fe5e08c 100644 (file)
@@ -820,8 +820,12 @@ class PowerParser:
     #  as I don't support 'and', 'or', and 'not' this works down to 'comparison'
 
     def p_test(self, p):
-        "test : comparison"
-        p[0] = p[1]
+        """test : comparison
+                | comparison QMARK test COLON test"""
+        if len(p) == 2:
+            p[0] = p[1]
+        else:
+            p[0] = ast.IfExp(test=p[1], body=p[3], orelse=p[5])
 
     # arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
     # | '**' test)