-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvisitor.py
66 lines (60 loc) · 2.4 KB
/
visitor.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 language.characteristicaVisitor import characteristicaVisitor
from internals.utils import logger
from internals.statement import Statement
from internals.tactic import TacticCall, Tactic
from antlr4 import FileStream, CommonTokenStream
from language.characteristicaLexer import characteristicaLexer
from language.characteristicaParser import characteristicaParser
class CustomVisitor(characteristicaVisitor):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.statDict = {}
self.tcList = []
self.tacticDict = {}
def visitImpr(self, ctx):
filename = ctx.lib.text
logger.debug(f"Importing {filename}.")
fs = FileStream(filename)
lex = characteristicaLexer(fs)
tokenst = CommonTokenStream(lex)
parser = characteristicaParser(tokenst)
tree = parser.prog()
self.visit(tree)
def visitStat(self, ctx):
statName = ctx.NAME().getText()
statLiteral = ctx.STATEMENT().getText()
logger.debug(f"Visited statement: {statName}.")
if statName in self.statDict.keys():
logger.warning(f"Redefined {statName}.")
s = Statement(statLiteral, statName)
self.statDict[statName] = s
return s
def visitAxiom(self, ctx):
axName = ctx.NAME().getText()
logger.debug(f"Visited axiom: {axName}")
self.statDict[axName].isVerified = True
return self.statDict[axName]
def visitTacticCall(self, ctx):
tacName = ctx.NAME().getText()
if not tacName in self.tacticDict.keys():
logger.warning(f"Calling undefined tactic {tacName}.")
return
tc = TacticCall(
self.tacticDict[tacName],
[x.getText() for x in ctx.variables.arg()],
[self.statDict[x.getText()] for x in ctx.requirements.arg()],
[self.statDict[x.getText()] for x in ctx.results.arg()]
)
self.tcList += [tc]
return tc
def visitTactic(self, ctx):
tc = ctx.tacticCall()
tacName = tc.NAME().getText()
t = Tactic(
tacName,
[x.getText() for x in tc.variables.arg()],
[self.statDict[x.getText()] for x in tc.requirements.arg()],
[self.statDict[x.getText()] for x in tc.results.arg()]
)
self.tacticDict[tacName] = t
return t