瀏覽代碼

Fix bug in zero-length blocks.

Joeri Exelmans 5 年之前
父節點
當前提交
99f2a33513

+ 6 - 1
src/sccd/action_lang/interactive/prompt.py

@@ -1,5 +1,6 @@
 import sys
 import readline
+import termcolor
 from sccd.action_lang.dynamic.memory import *
 from sccd.action_lang.parser.text import *
 from lark.exceptions import *
@@ -13,8 +14,9 @@ if __name__ == "__main__":
   while True:
     try:
       line = input("> ")
-      stmt = parse_stmt(line)
+      stmt = parse_block(line)
       stmt.init_stmt(scope)
+      print_debug(termcolor.colored(str(stmt), 'yellow'))
 
       # Grow current stack frame if necessary
       diff = scope.size() - len(memory.current_frame().storage)
@@ -27,6 +29,9 @@ if __name__ == "__main__":
       else:
         stmt.exec(memory)
 
+    except (UnexpectedToken, UnexpectedCharacters) as e:
+      print(" " + " "*e.column + "^")
+      print(e)
     except (LarkError, ModelError, SCCDRuntimeException) as e:
       print(e)
     except KeyboardInterrupt:

+ 2 - 5
src/sccd/action_lang/parser/text.py

@@ -104,15 +104,12 @@ class ExpressionTransformer(Transformer):
 # Global variables so we don't have to rebuild our parser every time
 # Obviously not thread-safe
 _transformer = ExpressionTransformer()
-_parser = Lark(action_lang_grammar, parser="lalr", start=["expr", "block", "stmt"], transformer=_transformer)
+_parser = Lark(action_lang_grammar, parser="lalr", start=["expr", "block"], transformer=_transformer)
 
 # Exported functions:
 
 def parse_expression(text: str) -> Expression:
   return _parser.parse(text, start="expr")
 
-def parse_block(text: str) -> Block:
+def parse_block(text: str) -> Statement:
   return _parser.parse(text, start="block")
-
-def parse_stmt(text: str) -> Statement:
-  return _parser.parse(text, start="stmt")

+ 3 - 0
src/sccd/action_lang/static/scope.py

@@ -66,6 +66,9 @@ class Scope:
 
     return s
 
+  def __repr__(self):
+    return "Scope(%s)" % self.name
+
   def _internal_lookup(self, name, offset=0) -> Optional[Tuple['Scope', int, _Variable]]:
     try:
       return (self, offset, self.names[name])

+ 1 - 0
src/sccd/action_lang/static/statement.py

@@ -125,6 +125,7 @@ class Block(Statement):
         return so_far
 
     def exec(self, memory: MemoryInterface) -> Return:
+        ret = DontReturn
         for stmt in self.stmts:
             ret = stmt.exec(memory)
             if ret.ret: