Skip to content

Commit 55873b0

Browse files
committed
Create AST listener
1 parent 892fbcb commit 55873b0

File tree

2 files changed

+158
-2
lines changed

2 files changed

+158
-2
lines changed

ast_listener.py

+142
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
from generated.MyParser import MyParser
2+
from generated.MyParserListener import MyParserListener
3+
4+
IND = "| "
5+
6+
7+
class ASTListener(MyParserListener):
8+
level = 0
9+
10+
def enterIf(self, ctx: MyParser.IfContext):
11+
print(IND * self.level + "if")
12+
self.level += 1
13+
14+
def exitIf(self, ctx: MyParser.IfContext):
15+
self.level -= 1
16+
17+
def enterThen(self, ctx: MyParser.ThenContext):
18+
print(IND * self.level + "then")
19+
self.level += 1
20+
21+
def exitThen(self, ctx: MyParser.ThenContext):
22+
self.level -= 1
23+
24+
def enterElse(self, ctx: MyParser.ElseContext):
25+
print(IND * self.level + "else")
26+
self.level += 1
27+
28+
def exitElse(self, ctx: MyParser.ElseContext):
29+
self.level -= 1
30+
31+
def enterForLoop(self, ctx: MyParser.ForLoopContext):
32+
print(IND * self.level + "for")
33+
self.level += 1
34+
35+
def exitForLoop(self, ctx: MyParser.ForLoopContext):
36+
self.level -= 1
37+
38+
def enterRange(self, ctx: MyParser.RangeContext):
39+
print(IND * self.level + "range")
40+
self.level += 1
41+
42+
def exitRange(self, ctx: MyParser.RangeContext):
43+
self.level -= 1
44+
45+
def enterWhileLoop(self, ctx: MyParser.WhileLoopContext):
46+
print(IND * self.level + "while")
47+
self.level += 1
48+
49+
def exitWhileLoop(self, ctx: MyParser.WhileLoopContext):
50+
self.level -= 1
51+
52+
def enterComparison(self, ctx: MyParser.ComparisonContext):
53+
operator = ctx.getChild(1)
54+
print(IND * self.level + operator.getText())
55+
self.level += 1
56+
57+
def exitComparison(self, ctx: MyParser.ComparisonContext):
58+
self.level -= 1
59+
60+
def enterAssignment(self, ctx: MyParser.AssignmentContext):
61+
operator = ctx.getChild(1)
62+
print(IND * self.level + operator.getText())
63+
self.level += 1
64+
65+
def exitAssignment(self, ctx: MyParser.AssignmentContext):
66+
self.level -= 1
67+
68+
def enterPrint(self, ctx: MyParser.PrintContext):
69+
print(IND * self.level + "print")
70+
self.level += 1
71+
72+
def exitPrint(self, ctx: MyParser.PrintContext):
73+
self.level -= 1
74+
75+
def enterReturn(self, ctx: MyParser.ReturnContext):
76+
print(IND * self.level + "return")
77+
self.level += 1
78+
79+
def exitReturn(self, ctx: MyParser.ReturnContext):
80+
self.level -= 1
81+
82+
def enterBinaryExpression(self, ctx: MyParser.BinaryExpressionContext):
83+
operator = ctx.getChild(1)
84+
print(IND * self.level + operator.getText())
85+
self.level += 1
86+
87+
def exitBinaryExpression(self, ctx: MyParser.BinaryExpressionContext):
88+
self.level -= 1
89+
90+
def enterTransposeExpression(self, ctx: MyParser.TransposeExpressionContext):
91+
print(IND * self.level + "transpose")
92+
self.level += 1
93+
94+
def exitTransposeExpression(self, ctx: MyParser.TransposeExpressionContext):
95+
self.level -= 1
96+
97+
def enterMinusExpression(self, ctx: MyParser.MinusExpressionContext):
98+
print(IND * self.level + "-")
99+
self.level += 1
100+
101+
def exitMinusExpression(self, ctx: MyParser.MinusExpressionContext):
102+
self.level -= 1
103+
104+
def enterSpecialMatrixFunction(self, ctx: MyParser.SpecialMatrixFunctionContext):
105+
function_name = ctx.getChild(0)
106+
print(IND * self.level + function_name.getText())
107+
self.level += 1
108+
109+
def exitSpecialMatrixFunction(self, ctx: MyParser.SpecialMatrixFunctionContext):
110+
self.level -= 1
111+
112+
def enterBreak(self, ctx: MyParser.BreakContext):
113+
print(IND * self.level + "break")
114+
115+
def enterContinue(self, ctx: MyParser.ContinueContext):
116+
print(IND * self.level + "continue")
117+
118+
def enterVector(self, ctx: MyParser.VectorContext):
119+
print(IND * self.level + "vector")
120+
self.level += 1
121+
122+
def exitVector(self, ctx: MyParser.VectorContext):
123+
self.level -= 1
124+
125+
def enterElementReference(self, ctx: MyParser.ElementReferenceContext):
126+
print(IND * self.level + "ref")
127+
self.level += 1
128+
129+
def exitElementReference(self, ctx: MyParser.ElementReferenceContext):
130+
self.level -= 1
131+
132+
def enterId(self, ctx: MyParser.IdContext):
133+
print(IND * self.level + ctx.getText())
134+
135+
def enterInt(self, ctx: MyParser.IntContext):
136+
print(IND * self.level + ctx.getText())
137+
138+
def enterFloat(self, ctx: MyParser.FloatContext):
139+
print(IND * self.level + ctx.getText())
140+
141+
def enterString(self, ctx: MyParser.StringContext):
142+
print(IND * self.level + ctx.getText())

main.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
#!/usr/bin/env python3
22
import typer
3-
from antlr4 import InputStream, CommonTokenStream
3+
from antlr4 import InputStream, CommonTokenStream, ParseTreeWalker
44
from generated.MyLexer import MyLexer
55
from generated.MyParser import MyParser
6+
from ast_listener import ASTListener
67

78
app = typer.Typer(no_args_is_help=True)
89

@@ -40,8 +41,21 @@ def parse(filename: str):
4041
stream = CommonTokenStream(lexer)
4142
parser = MyParser(stream)
4243

44+
parser.program()
45+
46+
@app.command()
47+
def ast(filename: str):
48+
"""Abstract syntax tree"""
49+
with open(filename, encoding="utf-8") as f:
50+
string = f.read()
51+
52+
lexer = MyLexer(InputStream(string))
53+
stream = CommonTokenStream(lexer)
54+
parser = MyParser(stream)
55+
4356
tree = parser.program()
44-
_print_tree(tree, parser)
57+
listener = ASTListener()
58+
ParseTreeWalker().walk(listener, tree)
4559

4660

4761
if __name__ == "__main__":

0 commit comments

Comments
 (0)