예제 #1
0
def main():
    import gonelex
    import goneparse
    import gonecheck
    import gonecode
    import goneblock
    import sys
    import ctypes
    from errors import subscribe_errors, errors_reported
    from llvm.ee import ExecutionEngine

    # Load the Gone runtime library (see Makefile)
    ctypes._dlopen('./gonert.so', ctypes.RTLD_GLOBAL)

    lexer = gonelex.make_lexer()
    parser = goneparse.make_parser()
    with subscribe_errors(lambda msg: sys.stdout.write(msg+"\n")):
        program = parser.parse(open(sys.argv[1]).read())
        # Check the program
        gonecheck.check_program(program)
        # If no errors occurred, generate code
        if not errors_reported():
            functions = gonecode.generate_code(program)
            # Emit the code sequence
            bv = LLVMBlockVisitor()
            bv.generate_llvm(functions)
            print(bv.llvm.module)

            # Verify and run function that was created during code generation
            print(":::: RUNNING ::::")
            bv.llvm.function.verify()
            llvm_executor = ExecutionEngine.new(bv.llvm.module)
            llvm_executor.run_function(bv.llvm.vars['__start'], [])
예제 #2
0
파일: semantic.py 프로젝트: pin3da/compiler
def main():
    import mpasparse
    import sys
    from errors import subscribe_errors
    lexer = mpaslex.make_lexer()
    parser = mpasparse.make_parser()
    with subscribe_errors(lambda msg: sys.stderr.write(msg+"\n")):
        program = parser.parse(open(sys.argv[1]).read())
        check_program(program)
예제 #3
0
def main():
    import pasparser
    import sys
    from errors import subscribe_errors
    lexer = paslex.make_lexer()
    parser = pasparser.make_parser()
    with subscribe_errors(lambda msg: sys.stdout.write(msg+"\n")):
        program = parser.parse(open(sys.argv[1]).read())
        check_program(program)
예제 #4
0
def run_lexer(data):
    import sys
    from errors import subscribe_errors
    lexer = make_lexer()
    with subscribe_errors(lambda msg: sys.stderr.write(msg+"\n")):
        lexer.input(data)
        for tok in iter(lexer.token, None):
            if tok:
                print(tok)
예제 #5
0
def main():
    import mpasparse
    import sys
    from errors import subscribe_errors
    parser = mpasparse.parser
    data = open("gcd.pas").read()
    with subscribe_errors(lambda msg: sys.stdout.write(msg + "\n")):
        program = parser.parse(data)
        check_program(program)
예제 #6
0
def run_lexer(data):
    import sys
    from errors import subscribe_errors
    lexer = make_lexer()
    with subscribe_errors(lambda msg: sys.stderr.write(msg + "\n")):
        lexer.input(data)
        for tok in iter(lexer.token, None):
            if tok:
                print(tok)
예제 #7
0
def main():
    import exprparse
    import sys
    from errors import subscribe_errors

    lexer = exprlex.make_lexer()
    parser = exprparse.make_parser()
    with subscribe_errors(lambda msg: sys.stdout.write(msg + "\n")):
        program = parser.parse(open(sys.argv[1]).read())
        # Check the program
        check_program(program)
예제 #8
0
def main():
    import gonelex
    import sys
    from errors import subscribe_errors
    lexer = gonelex.make_lexer()
    parser = make_parser()
    with subscribe_errors(lambda msg: sys.stdout.write(msg + "\n")):
        program = parser.parse(open(sys.argv[1]).read())

    # Output the resulting parse tree structure
    for depth, node in flatten(program):
        print("%s%s" % (" " * (4 * depth), node))
예제 #9
0
def main():
    import sys
    from errors import subscribe_errors

    if len(sys.argv) != 2:
        sys.stderr.write("Usage: %s filename\n" % sys.argv[0])
        raise SystemExit(1)

    lexer = make_lexer()
    with subscribe_errors(lambda msg: sys.stderr.write(msg + "\n")):
        lexer.input(open(sys.argv[1]).read())
        for tok in iter(lexer.token, None):
            sys.stdout.write("%s\n" % tok)
예제 #10
0
def main():
    import gonelex
    import goneparse
    import gonecheck
    import gonecode
    import sys
    import ctypes
    import time
    import argparse
    from errors import subscribe_errors, errors_reported
    from llvm.ee import ExecutionEngine

    global args
    parser = argparse.ArgumentParser("Compile and run a Gone program from a .g file")
    parser.add_argument('file', type=str, default='', nargs=1,
                        help="the file containing Gone source")
    parser.add_argument('--verbose', '-v', action="store_true",
                        help="print verbose output")
    parser.add_argument('--validate', '-c', action="store_true",
                        help="perform llvm bitcode validation prior to program execution")
    args = parser.parse_args()

    # Load the Gone runtime library (see Makefile)
    ctypes._dlopen('./gonert.so', ctypes.RTLD_GLOBAL)

    lexer = gonelex.make_lexer()
    parser = goneparse.make_parser()
    with subscribe_errors(lambda msg: sys.stdout.write(msg + "\n")):
        program = parser.parse(open(args.file[0]).read())
        gonecheck.check_program(program)
        if not errors_reported():
            code = gonecode.generate_code(program)
            g = GenerateLLVMBlockVisitor()
            g.visit_functions(code.functions)

            if args.verbose:
                print("---- NATIVE ASSEMBLY ----")
                print(g.generator.module.to_native_assembly())
                print("---- END NATIVE ASSEMBLY ----")

            if args.verbose:
                print(":::: RUNNING ::::")
            start = time.time()

            llvm_executor = ExecutionEngine.new(g.generator.module)
            llvm_executor.run_function(g.generator.main_func, [])

            if args.verbose:
                print(":::: FINISHED ::::")
                print("execution time: {0:.15f}s".format(time.time() - start))
예제 #11
0
def check(file_name):
    """Realiza analisis semantico/sintactico y genera codigo ensamblador spark"""
    f = open(str(file_name))
    data = f.read()
    with subscribe_errors(lambda msg: sys.stdout.write(msg + "\n")):
        program = parser.parse(data)
        check_program(program)
    f.close()

    outname = os.path.splitext(file_name)[0] + '.s'
    if program:
        import mpasgen
        outfile = open(outname, "w")
        mpasgen.generate(outfile, program)
        outfile.close()
예제 #12
0
def main():
    import gonelex
    import goneparse
    import gonecheck
    import sys
    from errors import subscribe_errors, errors_reported
    lexer = gonelex.make_lexer()
    parser = goneparse.make_parser()
    with subscribe_errors(lambda msg: sys.stdout.write(msg + "\n")):
        program = parser.parse(open(sys.argv[1]).read())
        # Check the program
        gonecheck.check_program(program)
        # If no errors occurred, generate code
        if not errors_reported():
            code = generate_code(program)
            code = EmitBlocksVisitor().loop(code.functions)
예제 #13
0
def main():
    import gonelex
    import goneparse
    import gonecheck
    import sys
    from errors import subscribe_errors, errors_reported
    from pprint import pformat
    lexer = gonelex.make_lexer()
    parser = goneparse.make_parser()
    with subscribe_errors(lambda msg: sys.stdout.write(msg+"\n")):
        program = parser.parse(open(sys.argv[1]).read())
        # Check the program
        gonecheck.check_program(program)
        # If no errors occurred, generate code
        if not errors_reported():
            functions = generate_code(program)
            for fn in functions:
                print(fn, '\n')
예제 #14
0
def main():
    import gonelex
    import goneparse
    import gonecheck
    import gonecode
    import sys
    from errors import subscribe_errors, errors_reported

    lexer = gonelex.make_lexer()
    parser = goneparse.make_parser()
    with subscribe_errors(lambda msg: sys.stdout.write(msg+"\n")):
        program = parser.parse(open(sys.argv[1]).read())
        # Check the program
        gonecheck.check_program(program)
        # If no errors occurred, generate code
        if not errors_reported():
            functions = gonecode.generate_code(program)
            functions = list(functions) # just be sure it doesn't exhause
            interpreter = Interpreter(functions)
            interpreter.run(functions[0]) # first func is the place to start
예제 #15
0
def main():
    import gonelex
    import goneparse
    import gonecheck
    import gonecode
    import sys
    import time
    from errors import subscribe_errors, errors_reported

    lexer = gonelex.make_lexer()
    parser = goneparse.make_parser()
    with subscribe_errors(lambda msg: sys.stdout.write(msg + "\n")):
        program = parser.parse(open(sys.argv[1]).read())
        # Check the program
        gonecheck.check_program(program)
        # If no errors occurred, generate code
        if not errors_reported():
            code = gonecode.generate_code(program)
            interpreter = Interpreter()
            start = time.clock()
            interpreter.run(code.code)
            print(":::: FINISHED ::::")
            print("execution time: {0:.15f}s".format(time.clock() - start))
예제 #16
0
    elif (re.match(r'.*\.pas', sys.argv[-1])):
        try:
            filename =  sys.argv[-1]
            outname = os.path.splitext(filename)[0] + '.s'

            file = open(filename)
            data = file.read()
            file.close()

            if ("-lex" in sys.argv):
                paslex.run_lexer(data)
            else:
                parser = pasparser.make_parser()
                clear_errors()
                try:
                    with subscribe_errors(lambda msg: sys.stdout.write(msg+"\n")):
                        root_ast = parser.parse(data)
                        check.check_program(root_ast);
                    errors = errors_reported();
                    if errors == 0:
                        if ("-ast" in sys.argv):
                            # dump_class_tree(root_ast)
                            dot = DotVisitor()
                            dot.generic_visit(root_ast)
                            print dot
                        # Generate code
                        outfile = open(outname, "w")
                        mpasgen.generate(outfile, root_ast)
                        outfile.close()
                    else:
                        sys.stderr.write("Number of errors: %d" % errors)
예제 #17
0
def generate_code(node):
    '''
	Genera código SSA desde el nodo AST suministrados
	'''
    gen = GenerateCode()
    gen.visit(node)
    return gen


if __name__ == '__main__':
    import lolalex
    import lolaparse
    import lolacheck
    import sys
    from errors import subscribe_errors, errors_reported

    lexer = golex.make_lexer()
    parser = goparse.make_parser()
    with subscribe_errors(lambda msg: sys.stdout.write(msg + "\n")):
        program = parser.parse(open(sys.argv[1]).read())

        # Comprueba el programa
        gocheck.check_program(program)

        # Si no se han producido errores, genere código
        if not errors_reported():
            code = generate_code(program)
            # Emitir la secuencia de código
            for inst in code.code:
                print(inst)
예제 #18
0
# goparser.py
# -*- coding: utf-8 -*-
from ply import yacc
from errors import error
from golex import tokens
from goast import *
precedence = (
    ('left', 'LOR'),
    ('left', 'LAND'),
    ('nonassoc', 'LT', 'LE', 'EQ', 'GT', 'GE', 'NE'),
    ('left', 'PLUS', "MINUS"),
    ('left', "TIMES", "DIVIDE", "MODULE"),
    ('nonassoc', 'LPAREN', 'RPAREN'),
    ('right',
     'UNARY'),  # operador ficticio para mantener la mas alta prioridad
)

# ----------------------------------------------------------------------
def p_program(p):
    '''
    program : statements
        | empty
    '''
    p[0] = Program(p[1])

def p_statements(p):
    '''
    statements :  statements statement
    '''
    p[0] = p[1]
예제 #19
0
# goparser.py
# -*- coding: utf-8 -*-
# ----------------------------------------------------------------------
# Los parsers son definidos usando el módulo yacc de PLY
#
# Vea http://www.dabeaz.com/ply/ply.html#ply_nn23
# ----------------------------------------------------------------------
from ply import yacc
# ----------------------------------------------------------------------
# El siguiente import carga la funcion error(lineno, msg) que debe ser
# usada para reportar todos los mensajes de error generados por su parser.
# Las pruebas Unitarias y otras caracteristicas del compilador se basaran
# en esta función.  vea el archivo errors.py para una mayor documentación
# acerca del mecanismo de manejo de errores.
from errors import error
# ----------------------------------------------------------------------
# Obtener la lista de token definidos en el módulo lexer.  Esto es
# necesario con el fin de validar y construir la tabla de sintaxis.
from golex import tokens
# ----------------------------------------------------------------------
# Obtener los nodos del AST.
# Lea las instrucciones en hocast.py
from goast import *
# ----------------------------------------------------------------------
# Tabla de precedencia de operadores.  Los operadores deben de seguir
# las mismas reglas de precedencia que Python.  Instrucciones que se
# dan el el proyecto.
# Vea http://www.dabeaz.com/ply/ply.html#ply_nn27
precedence = (
    ('right', 'ASSIGN', 'POSITIVEINCREASE', 'NEGATIVEINCREASE',