]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blobdiff - parser/build_ast.py
Use grako instead of PLY to compile EBNF to Python
[phdru.name/cgi-bin/blog-ru/search-tags.git] / parser / build_ast.py
diff --git a/parser/build_ast.py b/parser/build_ast.py
new file mode 100644 (file)
index 0000000..de87f84
--- /dev/null
@@ -0,0 +1,31 @@
+
+from parser import TagsSemantics as _TagsSemantics
+
+class TagsSemantics(_TagsSemantics):
+    def expression(self, ast):
+        if isinstance(ast, str):  # name
+            return ast
+        if isinstance(ast, unicode):  # name
+            return str(ast)
+        if isinstance(ast, list):
+            ast = tuple(ast)
+        elif not isinstance(ast, tuple):
+            raise TypeError("Expected a list, got %r %s" % (type(ast), ast))
+        if len(ast) == 3:
+            return (ast[1], ast[0], ast[2])
+        return ast
+
+    def expression_parens(self, ast):
+        return ('PARENS', ast[1])
+
+    def name(self, ast):
+        return ('NAME', str(ast))
+
+    def and_op(self, ast):
+        return 'AND'
+
+    def or_op(self, ast):
+        return 'OR'
+
+    def not_op(self, ast):
+        return 'NOT'