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)
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 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)
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))