67 lines
2.0 KiB
Python
67 lines
2.0 KiB
Python
#! /usr/bin/env python3
|
|
"""
|
|
Usage:
|
|
python3 arit.py <filename>
|
|
"""
|
|
# Main file for MIF08 - Lab03 - 2018, changed in 2022
|
|
|
|
from AritLexer import AritLexer
|
|
from AritParser import AritParser, UnknownIdentifier, DivByZero
|
|
from antlr4 import FileStream, CommonTokenStream, StdinStream
|
|
from antlr4.tree.Trees import Trees
|
|
from antlr4.Utils import escapeWhitespace
|
|
|
|
import argparse
|
|
|
|
|
|
def getNodeText(node, parser):
|
|
return escapeWhitespace(Trees.getNodeText(node, recog=parser),
|
|
True).replace('\\', '\\\\')
|
|
|
|
|
|
def _toDot(t, g, parser):
|
|
for c in Trees.getChildren(t):
|
|
g.node(str(id(c)), getNodeText(c, parser))
|
|
g.edge(str(id(t)), str(id(c)))
|
|
_toDot(c, g, parser)
|
|
|
|
|
|
def toDot(t, parser):
|
|
from graphviz import Digraph
|
|
g = Digraph()
|
|
g.node(str(id(t)), getNodeText(t, parser))
|
|
_toDot(t, g, parser)
|
|
g.render("tree.dot", view=True)
|
|
|
|
|
|
def main(inputname, lisp, debug):
|
|
if inputname is None:
|
|
lexer = AritLexer(StdinStream())
|
|
else:
|
|
lexer = AritLexer(FileStream(inputname))
|
|
stream = CommonTokenStream(lexer)
|
|
parser = AritParser(stream)
|
|
try:
|
|
tree = parser.prog()
|
|
if lisp:
|
|
print(tree.toStringTree(tree, parser))
|
|
if debug:
|
|
toDot(tree, parser)
|
|
except UnknownIdentifier as exc: # Parser's exception
|
|
print('{} is undefined'.format(exc.args[0]))
|
|
exit(1)
|
|
except DivByZero:
|
|
print('Division by zero')
|
|
exit(1)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser(description='AritEval lab')
|
|
parser.add_argument('filename', type=str, nargs='?', help='Source file.')
|
|
parser.add_argument('--lisp', default=False, action='store_true',
|
|
help="Print parse tree in Lisp format")
|
|
parser.add_argument('--debug', default=False, action='store_true',
|
|
help="Print parse tree graphically")
|
|
args = parser.parse_args()
|
|
main(args.filename, args.lisp, args.debug)
|