Fix parser, matcher
diff --git a/Parser.cpp b/Parser.cpp
index 2d6b992..9233fbd 100644
--- a/Parser.cpp
+++ b/Parser.cpp
@@ -31,20 +31,22 @@
         get();
 }
 
-bool Parser::parseSymbol(AstNode *node)
+template <typename T>
+bool Parser::parseSymbol(T *node)
 {
     skip();
 
     if (peek().isLetter())
     {
-        *node = AstNode(get());
+        *node = T(get());
         return true;
     }
 
     return false;
 }
 
-bool Parser::parseIdentifier(AstNode *node)
+template <typename T>
+bool Parser::parseIdentifier(T *node)
 {
     skip();
 
@@ -57,14 +59,15 @@
             buffer += get();
         }
 
-        *node = AstNode(buffer);
+        *node = T(buffer);
         return true;
     }
 
     return false;
 }
 
-bool Parser::parseNumber(AstNode *node)
+template <typename T>
+bool Parser::parseNumber(T *node)
 {
     skip();
 
@@ -75,14 +78,15 @@
         while (peek().isDigit())
             buffer += get();
 
-        *node = AstNode(buffer.toInt());
+        *node = T(buffer.toInt());
         return true;
     }
 
     return false;
 }
 
-bool Parser::parseVariable(AstNode *node)
+template <typename T>
+bool Parser::parseVariable(T *node)
 {
     skip();
 
@@ -96,11 +100,16 @@
         {
             get();
 
-            AstNode identNode;
+            T nameNode;
 
-            if (parseIdentifier(&identNode))
+            if (parseIdentifier(&nameNode))
             {
-                *node = AstNode(type, identNode.name());
+                *node = T(type, nameNode.name());
+                return true;
+            }
+            else if (parseSymbol(&nameNode))
+            {
+                *node = T(type, QString(nameNode.symbol()));
                 return true;
             }
         }
@@ -110,20 +119,11 @@
     return false;
 }
 
-bool Parser::parseOne(AstNode *node)
+template <typename T>
+QList<T> Parser::parseMany()
 {
-    return parseFunction(node) ||
-           parseVariable(node) ||
-           parseNumber(node) ||
-           parseIdentifier(node) ||
-           parseSymbol(node) ||
-           parseParens(node);
-}
-
-QList<AstNode> Parser::parseMany()
-{
-    QList<AstNode> nodes;
-    AstNode next;
+    QList<T > nodes;
+    T next;
 
     while (parseOne(&next))
     {
@@ -133,7 +133,8 @@
     return nodes;
 }
 
-bool Parser::parseParens(AstNode *node)
+template <typename T>
+bool Parser::parseParens(T *node)
 {
     skip();
 
@@ -144,8 +145,8 @@
 
     get();
 
-    QList<AstNode> many = parseMany();
-    *node = AstNode(many);
+    QList<T> many = parseMany<T>();
+    *node = T(many);
 
     skip();
     if (peek() != ')')
@@ -177,7 +178,7 @@
         return false;
     }
 
-    QList<AstNode> body = parseMany();
+    QList<AstNode> body = parseMany<AstNode>();
     *node = AstNode(head.name(), body);
 
     skip();
@@ -191,3 +192,24 @@
 
     return true;
 }
+
+template <>
+bool Parser::parseOne<Token>(Token *node)
+{
+    return parseVariable(node) ||
+           parseNumber(node) ||
+           parseIdentifier(node) ||
+           parseSymbol(node) ||
+           parseParens(node);
+}
+
+template <>
+bool Parser::parseOne<AstNode>(AstNode *node)
+{
+    return parseFunction(node) ||
+           parseVariable(node) ||
+           parseNumber(node) ||
+           parseIdentifier(node) ||
+           parseSymbol(node) ||
+           parseParens(node);
+}