-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathScript.py
66 lines (49 loc) · 1.94 KB
/
Script.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from antlr4 import FileStream, CommonTokenStream, ParseTreeWalker, ParseTreeListener, Token
from antlr4.error.ErrorListener import ErrorListener
import sys
from antlr.JailBreakLangLexer import JailBreakLangLexer
from antlr.JailBreakLangParser import JailBreakLangParser
from antlr.JailBreakLangVisitorCustom import JailBreakLang
from antlr.JailBreakLangListenerCustom import JailBreakLangListenerCustom, IDListenerLexer
from antlr.JailBreakLangLexer import JailBreakLangLexer
import warnings
class MyErrorListener(ErrorListener):
def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e):
raise ValueError(f"Syntax error on line {line}, column {column}: {msg}")
class IDVisitor(ParseTreeListener):
#def __init__(self):
# self.ids = set()
def visitTerminal(self, node):
if node.symbol.type == JailBreakLangLexer.ID:
if node.symbol.text not in set_of_vars:
raise SyntaxError("Cannot use undeclared variable:", node.symbol.text)
#self.ids.add(node.symbol.text)
def find_ids():
input_stream = FileStream(sys.argv[1])
lexer = JailBreakLangLexer(input_stream)
token_stream = CommonTokenStream(lexer)
parser = JailBreakLangParser(token_stream)
tree = parser.start()
visitor = IDVisitor()
walker = ParseTreeWalker()
walker.walk(visitor, tree)
#return visitor.ids
input_stream = FileStream(sys.argv[1])
lexer = JailBreakLangLexer(input_stream)
token_stream = CommonTokenStream(lexer)
parser = JailBreakLangParser(token_stream)
# Add the error listener to the parser
error_listener = MyErrorListener()
parser.addErrorListener(error_listener)
tree = parser.start()
# First walk
listener = JailBreakLangListenerCustom()
walker = ParseTreeWalker()
walker.walk(listener, tree)
set_of_vars = listener.exitProgram()
# Second walk
find_ids()
# Actual compiling
lexer = JailBreakLangLexer(input_stream)
visitor = JailBreakLang()
visitor.visit(tree)