def main(filename): print("----------Parser Debug-------------") tokenizer = Tokenizer(filename) tokenizer.tokenize() lexer = Lexer(tokenizer.getTokens()) lexer.lex() parser = Parser(lexer.getTokens()) parser.parse() print(parser.getTree()) print("\n----------Execution Stack-----------") interpreter = Interpreter(parser.getTree()) interpreter.interpret() print("\n----------Program Output------------") return interpreter.output()
def main(): # Load in test code testcode = open("Test/testcode.txt", "r") contents = testcode.read() scan = Scanner() for symbol in contents: Scanner.read_symbol(scan, symbol) print("identifiers:") print(scan.identifiers) print("\n") print("consts:") print(scan.consts) print("________") for line in scan.lineCollection: for token in line: print("type: " + str(token.enum_type) + " id: " + str(token.id), end=' | ') print("") print("________") parser = Parser(Scanner.lineCollection) parsed_block = parser.parse() print("") print("________") print("") Interpreter.consts = scan.consts Interpreter.identifiers = scan.identifiers Interpreter.interpret(parsed_block.statements)
# (sort 1 9 28 1 3) # (apply sort '(1 99 71 53)) """ (define (sort . z) (define (bmerge a b) (if (null? b) a (if (null? a) b (if (b< (car a) (car b)) (cons (car a) (bmerge (cdr a) b)) (cons (car b) (bmerge a (cdr b))))))) (define (merge a . z) (if (null? z) a (apply merge (cons (bmerge a (car z)) (cdr z))))) (apply merge (map (lambda (x) (cons x ())) z))) """) root = parser.parse() while root != None: root.eval(global_env) root = parser.parse() BuiltInNode.set_starting_env(built_in_env, global_env) while True: try: parser.feed(input()) root = parser.parse() while root != None: root.eval(global_env).print(0) print() root = parser.parse() except KeyboardInterrupt:
def empezar(): import sys archivoEntrada = open(sys.argv[1], 'r') analizadorLexico = Lexer() entrada = archivoEntrada.read() analizadorLexico.input(entrada) lineatokens = '' try: for token in iter(analizadorLexico.lexer.token, None): lineatokens += repr(token.type) + ' ' + repr( token.value) + ' ' + repr(token.lineno) lineatokens += '\n' except Error.LexicalError.LexicalError as error: lineatokens = error.mensaje archivoEntrada.close() analizadorSintactico = Parser(analizadorLexico.tokens) analizadorLexico.lexer.lineno = 1 try: raiz = analizadorSintactico.parse(entrada) Parser.linea += 'Programa:\n' for clase in raiz: clase.imprimir() except Error.SyntacticalError.SyntacticalError as error: Parser.linea = error.mensaje analizadorSemantico = VisitanteTabla() try: analizadorSemantico.visitarProgram(raiz) except Error.SemanticError.SemanticError as error: try: analizadorSemantico.linea = error.mensaje analizadorSemantico.linea += '\nEl error se dio en la clase: ' + analizadorSemantico.metodoActual.tabla.padre.nombre + ', metodo: ' + analizadorSemantico.metodoActual.tabla.nombre except BaseException: pass analizadorCodigo = VisitanteLir(analizadorSemantico.tablaPrincipal) analizadorCodigo.visitarProgram(raiz) dump_tokens = 0 dump_ast = 0 dump_symtab = 0 dump_lir = 0 for parametro in sys.argv: if parametro[0] == '-': if parametro == '-dump-tokens': dump_tokens = 1 if parametro == '-dump-ast': dump_ast = 1 if parametro == '-dump-symtab': dump_symtab = 1 if parametro == '-dump-lir': dump_lir = 1 if (dump_tokens): archivoSalida = open(sys.argv[1][:-3] + '.tok', 'w') archivoSalida.write(lineatokens) print "Tokens fueron escritos a: %s" % (str(sys.argv[1][:-3] + '.tok')) archivoSalida.close() if (dump_ast): archivoSalida = open(sys.argv[1][:-3] + '.ast', 'w') archivoSalida.write(Parser.linea) print "Salida del AST fue escrita a: %s" % (str(sys.argv[1][:-3] + '.ast')) archivoSalida.close() if (dump_symtab): archivoSalida = open(sys.argv[1][:-3] + '.sym', 'w') archivoSalida.write(analizadorSemantico.linea) print "Salida de la tabla de simbolos fue escrita a: %s" % ( str(sys.argv[1][:-3] + '.sym')) archivoSalida.close() if (dump_lir): archivoSalida = open(sys.argv[1][:-3] + '.lir', 'w') archivoSalida.write(analizadorCodigo.linea) print "Codigo intermedio escrito a: %s" % (str(sys.argv[1][:-3] + '.lir')) archivoSalida.close() listabat = analizadorCodigo.linea.split('\n') lineabat = '@ECHO OFF\n' if listabat[0] == '': listabat = listabat[1:] lineabat += 'echo ' + listabat[0] + '>codigo.tmp\n' for linea in listabat[1:]: if linea == '': lineabat += 'echo+>>codigo.tmp\n' else: lineabat += 'echo ' + linea + '>>codigo.tmp\n' lineabat += 'java -jar microLIR.jar codigo.tmp\necho+\npause\ndel codigo.tmp' archivoSalida = open(sys.argv[1][:-3] + '.bat', 'w') archivoSalida.write(lineabat) print 'Archivo batch ejecutable escrito a: ' + sys.argv[1][:-3] + '.bat' archivoSalida.close()
def empezar(): import sys archivoEntrada = open(sys.argv[1], 'r') analizadorLexico = Lexer() entrada = archivoEntrada.read() analizadorLexico.input(entrada) lineatokens = '' try: for token in iter(analizadorLexico.lexer.token, None): lineatokens += repr(token.type) + ' ' + repr(token.value) + ' ' + repr(token.lineno) lineatokens += '\n' except Error.LexicalError.LexicalError as error: lineatokens = error.mensaje archivoEntrada.close() analizadorSintactico = Parser(analizadorLexico.tokens) analizadorLexico.lexer.lineno = 1 try: raiz = analizadorSintactico.parse(entrada) Parser.linea += 'Programa:\n' for clase in raiz: clase.imprimir() except Error.SyntacticalError.SyntacticalError as error: Parser.linea = error.mensaje analizadorSemantico = VisitanteTabla() try: analizadorSemantico.visitarProgram(raiz) except Error.SemanticError.SemanticError as error: try: analizadorSemantico.linea = error.mensaje analizadorSemantico.linea += '\nEl error se dio en la clase: ' + analizadorSemantico.metodoActual.tabla.padre.nombre + ', metodo: ' + analizadorSemantico.metodoActual.tabla.nombre except BaseException: pass analizadorCodigo = VisitanteLir(analizadorSemantico.tablaPrincipal) analizadorCodigo.visitarProgram(raiz) dump_tokens = 0 dump_ast = 0 dump_symtab = 0 dump_lir = 0 for parametro in sys.argv: if parametro[0] == '-': if parametro == '-dump-tokens': dump_tokens = 1 if parametro == '-dump-ast': dump_ast = 1 if parametro == '-dump-symtab': dump_symtab = 1 if parametro == '-dump-lir': dump_lir = 1 if(dump_tokens): archivoSalida = open(sys.argv[1][:-3] + '.tok', 'w') archivoSalida.write(lineatokens) print "Tokens fueron escritos a: %s" % (str(sys.argv[1][:-3] + '.tok')) archivoSalida.close() if(dump_ast): archivoSalida = open(sys.argv[1][:-3] + '.ast', 'w') archivoSalida.write(Parser.linea) print "Salida del AST fue escrita a: %s" % (str(sys.argv[1][:-3] + '.ast')) archivoSalida.close() if(dump_symtab): archivoSalida = open(sys.argv[1][:-3] + '.sym', 'w') archivoSalida.write(analizadorSemantico.linea) print "Salida de la tabla de simbolos fue escrita a: %s" % (str(sys.argv[1][:-3] + '.sym')) archivoSalida.close() if(dump_lir): archivoSalida = open(sys.argv[1][:-3] + '.lir', 'w') archivoSalida.write(analizadorCodigo.linea) print "Codigo intermedio escrito a: %s" % (str(sys.argv[1][:-3] + '.lir')) archivoSalida.close() listabat = analizadorCodigo.linea.split('\n') lineabat = '@ECHO OFF\n' if listabat[0] == '': listabat = listabat[1:] lineabat += 'echo ' + listabat[0] + '>codigo.tmp\n' for linea in listabat[1:]: if linea == '': lineabat += 'echo+>>codigo.tmp\n' else: lineabat += 'echo ' + linea + '>>codigo.tmp\n' lineabat += 'java -jar microLIR.jar codigo.tmp\necho+\npause\ndel codigo.tmp' archivoSalida = open(sys.argv[1][:-3] + '.bat', 'w') archivoSalida.write(lineabat) print 'Archivo batch ejecutable escrito a: ' + sys.argv[1][:-3] + '.bat' archivoSalida.close()