Эх сурвалжийг харах

Started implementing function parsing.

Taddeus Kroes 14 жил өмнө
parent
commit
1752a601a1
2 өөрчлөгдсөн 47 нэмэгдсэн , 3 устгасан
  1. 2 0
      src/node.py
  2. 45 3
      src/parser.py

+ 2 - 0
src/node.py

@@ -92,6 +92,8 @@ TOKEN_MAP = {
         OP_REWRITE: 'REWRITE',
         OP_REWRITE: 'REWRITE',
         }
         }
 
 
+FUNCTIONS = [OP_SQRT, OP_SIN, OP_COS, OP_TAN, OP_INT, OP_SOLVE]
+
 
 
 def to_expression(obj):
 def to_expression(obj):
     return obj if isinstance(obj, ExpressionBase) else ExpressionLeaf(obj)
     return obj if isinstance(obj, ExpressionBase) else ExpressionLeaf(obj)

+ 45 - 3
src/parser.py

@@ -307,6 +307,7 @@ class Parser(BisonParser):
         """
         """
         exp : NUMBER
         exp : NUMBER
             | IDENTIFIER
             | IDENTIFIER
+            | function
             | LPAREN exp RPAREN
             | LPAREN exp RPAREN
             | unary
             | unary
             | binary
             | binary
@@ -322,10 +323,13 @@ class Parser(BisonParser):
         if option == 1:  # rule: IDENTIFIER
         if option == 1:  # rule: IDENTIFIER
             return Leaf(values[0])
             return Leaf(values[0])
 
 
-        if option == 2:  # rule: LPAREN exp RPAREN
+        if option == 2:  # rule: function
+            return values[0]
+
+        if option == 3:  # rule: LPAREN exp RPAREN
             return values[1]
             return values[1]
 
 
-        if option in [3, 4, 5]:  # rule: unary | binary | nary
+        if option in [4, 5, 6]:  # rule: unary | binary | nary
             return values[0]
             return values[0]
 
 
         raise BisonSyntaxError('Unsupported option %d in target "%s".'
         raise BisonSyntaxError('Unsupported option %d in target "%s".'
@@ -390,6 +394,45 @@ class Parser(BisonParser):
         raise BisonSyntaxError('Unsupported option %d in target "%s".'
         raise BisonSyntaxError('Unsupported option %d in target "%s".'
                                % (option, target))  # pragma: nocover
                                % (option, target))  # pragma: nocover
 
 
+    def on_function(self, target, option, names, values):
+        """
+        function : function_name LPAREN arglist RPAREN
+        """
+
+        if option == 0:  # rule: function_name LPAREN arglist RPAREN
+            print 'FUNCTION:', values[0], values[2]
+            return Node(values[0], *values[2])
+
+        raise BisonSyntaxError('Unsupported option %d in target "%s".'
+                               % (option, target))  # pragma: nocover
+
+    def on_function_name(self, target, option, names, values):
+        """
+        function_name : SQRT | SIN | COS | TAN | INT | SOLVE
+        """
+
+        if 0 <= option <= 5:  # rule: SQRT | SIN | COS | TAN | INT | SOLVE
+            return values[0]
+            #return TOKEN_OP_MAP[values[0]]
+
+        raise BisonSyntaxError('Unsupported option %d in target "%s".'
+                               % (option, target))  # pragma: nocover
+
+    def on_arglist(self, target, option, names, values):
+        """
+        arglist : arglist COMMA exp
+                | exp
+        """
+
+        if option == 0:  # rule: arglist COMMA exp
+            return values[0] + [values[2]]
+
+        if option == 1:  # rule: exp
+            return [values[0]]
+
+        raise BisonSyntaxError('Unsupported option %d in target "%s".'
+                               % (option, target))  # pragma: nocover
+
     # -----------------------------------------
     # -----------------------------------------
     # operator tokens
     # operator tokens
     # -----------------------------------------
     # -----------------------------------------
@@ -436,7 +479,6 @@ class Parser(BisonParser):
     [a-zA-Z]  { returntoken(IDENTIFIER); }
     [a-zA-Z]  { returntoken(IDENTIFIER); }
     "("       { returntoken(LPAREN); }
     "("       { returntoken(LPAREN); }
     ")"       { returntoken(RPAREN); }
     ")"       { returntoken(RPAREN); }
-    ","       { returntoken(COMMA); }
     """ + operators + r"""
     """ + operators + r"""
     "raise"   { returntoken(RAISE); }
     "raise"   { returntoken(RAISE); }
     "graph"   { returntoken(GRAPH); }
     "graph"   { returntoken(GRAPH); }