add support for syntax "do i = N to N" equivalent to for
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 4 Apr 2020 20:28:55 +0000 (21:28 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 4 Apr 2020 20:28:58 +0000 (21:28 +0100)
also fix bug where "for i = N" was getting early-reduced
to "for {comparison}" because "=" is also used as a comparator

src/soc/decoder/power_pseudo.py
src/soc/decoder/pseudo/lexer.py
src/soc/decoder/pseudo/parser.py

index 37a5d72b0b7b501c213a52de092580cd0641513f..3ac60c14093ae93f9cb51cd49d4c3a9a43168650 100644 (file)
@@ -135,12 +135,12 @@ MEM(EA, 4) <- GPR(r)[32:63]
 """
 
 testdo = r"""
-for i = 0 to 7
+do i = 0 to 7
     print(i)
 """
 
 code = testdo
-code = _bpermd
+#code = _bpermd
 #code = testmul
 #code = testgetzero
 #code = testcat
@@ -180,7 +180,7 @@ def convert_to_python(pcode):
 
 def test():
 
-    gsc = GardenSnakeCompiler()
+    gsc = GardenSnakeCompiler(debug=True)
 
     gsc.regfile = {}
     for i in range(32):
index 3638a7fe4c285b02ed4bb775c087c927fbbed099..3d39881753906b60a9e42760c1c8d1887cdca1e6 100644 (file)
@@ -47,7 +47,7 @@ def python_colonify(lexer, tokens):
             token = copy(token)
             token.type = "COLON"
             yield token
-        elif token.type in ['WHILE', 'FOR']:
+        elif token.type in ['DO', 'WHILE', 'FOR']:
             forwhile_seen = True
             yield token
         elif token.type == 'NEWLINE':
index c7db0cbd7545bb997b3c0be667f529d849f6c1f2..8613d2a460fed4d954e3b7775d611369b711fb62 100644 (file)
@@ -381,7 +381,8 @@ class PowerParser:
         p[0] = ast.Break()
 
     def p_for_stmt(self, p):
-        """for_stmt : FOR test EQ test TO test COLON suite
+        """for_stmt : FOR atom EQ test TO test COLON suite
+                    | DO atom EQ test TO test COLON suite
         """
         # auto-add-one (sigh) due to python range
         start = p[4]
@@ -645,20 +646,21 @@ class PowerParser:
 
 
 class GardenSnakeParser(PowerParser):
-    def __init__(self, lexer=None):
+    def __init__(self, lexer=None, debug=False):
         PowerParser.__init__(self)
+        self.debug = debug
         if lexer is None:
             lexer = IndentLexer(debug=0)
         self.lexer = lexer
         self.tokens = lexer.tokens
         self.parser = yacc.yacc(module=self, start="file_input_end",
-                                debug=False, write_tables=False)
+                                debug=debug, write_tables=False)
 
         self.sd = create_pdecode()
 
     def parse(self, code):
         # self.lexer.input(code)
-        result = self.parser.parse(code, lexer=self.lexer, debug=False)
+        result = self.parser.parse(code, lexer=self.lexer, debug=self.debug)
         return ast.Module(result)
 
 
@@ -667,8 +669,8 @@ class GardenSnakeParser(PowerParser):
 #from compiler import misc, syntax, pycodegen
 
 class GardenSnakeCompiler(object):
-    def __init__(self):
-        self.parser = GardenSnakeParser()
+    def __init__(self, debug=False):
+        self.parser = GardenSnakeParser(debug=debug)
 
     def compile(self, code, mode="exec", filename="<string>"):
         tree = self.parser.parse(code)