diff --git a/parser.py b/parser.py new file mode 100644 index 0000000000000000000000000000000000000000..70235f4cc79f9c9757c444fb487a7c4d597ebebf --- /dev/null +++ b/parser.py @@ -0,0 +1,48 @@ +from graphviz import Digraph +# Parser: parses the stream of tokens generated by the lexer and creates an abstract syntax tree + +# Each token will become a node in the graph +# Nodes are represented with the Node type, each instance of which contains a "children" array which holds more Nodes +class Node: + def __init__(self, name): + self.name = name + self.children = [] + + def add(self, node): + self.children.append(node) + +# Ingredient ::= +def ingredient(): + node = Node('ingredient') + +# Amount ::= Digit+ ("-" | "/" | "to")? Digit* +def amount(): + node = Node('digit') + if nextToken().type == 'digit': + return node + +# Digit ::= ("0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9")+ +def digit(): + node = Node('digit') + +def unit(): + node = Node('unit') + +def example(): + text = "10 to 20 minutes" + dot = Digraph(comment='Abstract Syntax Tree') + dot.node('a', 'amount') + dot.node('d', 'digit') + dot.edge('a', 'd') + dot.node('t', '10') + dot.edge('d', 't') + dot.node('to') + dot.node('digit') + dot.node('unit') + dot.render('ast.gv', view=True) + +def draw(): + dot = Digraph(comment='Abstract Syntax Tree') + dot.render('ast.gv', view=True) + +example()