瀏覽代碼

Fixed all problems by breaking the parser (again): this problem is in
many functions and I don't know enough about it to fix it everywhere

Yentl Van Tendeloo 8 年之前
父節點
當前提交
07aea5d6b2

+ 1 - 1
interface/HUTN/grammars/actionlanguage.g

@@ -116,7 +116,7 @@ grammar{
 
     parameter: ID COLON type_specifier;
 
-    return: RETURN expression?;
+    return: RETURN expression? EXCLAMATION;
 
     indent: TAB;
 

+ 13 - 4
interface/HUTN/hutn_compiler/hutnparser.py

@@ -294,7 +294,18 @@ class Parser(object):
         self.input = text
         results = self.applyrule('@start', 0)
         print("Results: " + str(len(results)))
-        if (results == [] or results[0]['endpos'] < len(self.input)):
+        if len(results) > 1:
+            # Handle ambiguity
+            from prettyprint_visitor import PrettyPrintVisitor
+            for p in results:
+                print("===================================")
+                print("VISIT RESULT")
+                print("===================================")
+                visitor = PrettyPrintVisitor([])
+                visitor.visit(p["tree"])
+                print(visitor.dump())
+            result = self.generateErrorReport()
+        elif (results == [] or results[0]['endpos'] < len(self.input)):
             result = self.generateErrorReport()
             for elem in result['partialresults']: #Added by Daniel there was no post processing on partial results. I need it
                 if elem['tree']: #with partial results the tree can be None
@@ -303,7 +314,7 @@ class Parser(object):
                         # elem['tree'].startpos = 0
                         # elem['tree'].endpos = 0
                         elem['tree'] = Parser.PositionPostProcessor(self.convertToLineColumn).visit(elem['tree']) #Added by Daniel
-        else:
+        elif len(results) == 1:
             result = results[0]
             result.update({'status': Parser.Constants.Success})
             if result['tree'].head != 'start':
@@ -820,8 +831,6 @@ class Parser(object):
                     if (newresults == []):
                         return []
                     newresults = self.merge('.', newresults, elem_p)
-                    r.extend(newresults)
-                newresults = r
             results = newresults
         return results
 

+ 1 - 0
interface/HUTN/hutn_compiler/prettyprint_visitor.py

@@ -21,6 +21,7 @@ class PrintVisitor(Visitor):
 class PrettyPrintVisitor(Visitor):
     def __init__(self, args):
         Visitor.__init__(self, args)
+        self.result = ""
 
     def visit(self, tree, level=0):
         if isinstance(tree, Tree):

+ 2 - 2
interface/HUTN/test/constructor_compilation_action_language/code/factorial.al

@@ -6,9 +6,9 @@ include "io.alh"
 
 Integer function factorial(n : Integer):
 	if(integer_lte(n, 1)):
-		return 1
+		return 1!
 	else:
-		return integer_multiplication(n, factorial(integer_subtraction(n, 1)))
+		return integer_multiplication(n, factorial(integer_subtraction(n, 1)))!
 
 Void function main():
 	while(True):

+ 2 - 2
interface/HUTN/test/constructor_compilation_action_language/code/fibonacci.al

@@ -6,9 +6,9 @@ include "io.alh"
 
 Integer function fib(param : Integer):
 	if (integer_lte(param, 2)):
-		return 1
+		return 1!
 	else:
-		return integer_addition(fib(integer_subtraction(param, 1)), fib(integer_subtraction(param, 2)))
+		return integer_addition(fib(integer_subtraction(param, 1)), fib(integer_subtraction(param, 2)))!
 
 Void function main():
 	while(True):

+ 1 - 1
interface/HUTN/test/constructor_compilation_action_language/code/fibonacci_smart.al

@@ -15,7 +15,7 @@ Integer function fib(param : Integer):
 	while (integer_gt(param, list_len(numbers))):
 		new = list_len(numbers)
 		list_append(numbers, integer_addition(dict_read(numbers, integer_subtraction(new, 2)), dict_read(numbers, integer_subtraction(new, 1))))
-	return dict_read(numbers, integer_subtraction(param, 1))
+	return dict_read(numbers, integer_subtraction(param, 1))!
 
 Void function main():
 	numbers = create_node()

+ 2 - 2
interface/HUTN/test/constructor_compilation_action_language/code/mutual_recursion.al

@@ -2,7 +2,7 @@ Void function main():
 	a()
 
 Integer function a():
-	return b()
+	return b()!
 
 Integer function b():
-	return a()
+	return a()!

+ 2 - 2
interface/HUTN/test/constructor_compilation_action_language/code/strange_return.al

@@ -1,2 +1,2 @@
-Void function main():
-	return (1)
+Integer function main():
+	return (1)!