示例#1
0
文件: parser.py 项目: Sanny26/COOL_Py
    def build(self, **kwargs):
        """Build the Parser."""
        # Parse the parameters
        if kwargs is None or len(kwargs) == 0:
            debug, write_tables, optimize, outputdir, yacctab, debuglog, errorlog = \
                self._debug, self._write_tables, self._optimize, self._outputdir, self._yacctab, self._debuglog, \
                self._errorlog
        else:
            debug = kwargs.get("debug", self._debug)
            write_tables = kwargs.get("write_tables", self._write_tables)
            optimize = kwargs.get("optimize", self._optimize)
            outputdir = kwargs.get("outputdir", self._outputdir)
            yacctab = kwargs.get("yacctab", self._yacctab)
            debuglog = kwargs.get("debuglog", self._debuglog)
            errorlog = kwargs.get("errorlog", self._errorlog)

        # Build PyCoolLexer
        self.lexer = make_lexer(debug=debug, optimize=optimize, outputdir=outputdir, debuglog=debuglog,
                                errorlog=errorlog)

        # Expose tokens collections to this instance scope
        self.tokens = self.lexer.tokens

        # Build yacc parser
        self.parser = yacc.yacc(module=self, write_tables=write_tables, debug=debug, optimize=optimize,
                                outputdir=outputdir, tabmodule=yacctab, debuglog=debuglog, errorlog=errorlog)
示例#2
0
def ddump_parse(source):
    import sys
    import lexer
    import errors
    from astutils import dump

    lexer = lexer.make_lexer()
    parser = yacc.yacc()

    with errors.listen():
        program = parser.parse(source)

    sys.stdout.write(dump(program)+'\n')
示例#3
0
def ddump_parse(source):
    import sys
    import lexer
    import errors
    from astutils import dump

    lexer = lexer.make_lexer()
    parser = yacc.yacc()

    with errors.listen():
        program = parser.parse(source)

    sys.stdout.write(dump(program) + '\n')

    def visit_WhileBlock(self,block):
        # Emit a conditional jump around the if-branch
        #inst = ('while', block.condvar)
        #block+=inst)
        self.visit_BasicBlock(block)
        self.visit(block.truebranch)


if __name__ == '__main__':
    import lexer
    import parser as parser 
    import check
    import sys
    from errors import subscribe_errors, errors_reported
    lexer = lexer.make_lexer()
    parser = parser.make_parser()
    with subscribe_errors(lambda msg: sys.stdout.write(msg+"\n")):
        program = parser.parse(open(sys.argv[1]).read())
        # Check the program
        env = check.check_program(program)
        # If no errors occurred, generate code
        if not errors_reported():
            code = generate_code(program)
            print code
            # Emit the code sequence
            JumpGenerator().visit(code)
            #for inst in code:
            #    print(inst)
示例#5
0
def p_empty(p):
    '''
    empty :
    '''


def p_error(p):
    if p:
        error(p.lineno, "Syntax error in input at token '%s'" % p.value)
    else:
        error("EOF", "Syntax error. No more input.")


def make_parser():
    parser = yacc.yacc()
    return parser


if __name__ == '__main__':
    import lexer
    import sys
    from errors import subscribe_errors
    lexer = lexer.make_lexer()
    parser = make_parser()
    tests = ["test1", "test2", "test3"]
    with subscribe_errors(lambda msg: sys.stdout.write(msg + "\n")):
        program = parser.parse((open(tests[1] + ".txt").read()), lexer, False)
        for depth, node in flatten(program):
            print("%s%s" % (" " * (4 * depth), node))