示例#1
0
def _parse_arg(arg, argtype):
    if not argtype:
        return
    result = None
    if argtype == 'str':
        return arg
    if fw.is_valid_range(argtype):
        return fw.restrict(arg, argtype)
    err.fatal('Internal error, unrecognized argtype', argtype)
示例#2
0
def _do_disassemble_file(fp, env):
    pathinfo = env['pathinfo']
    if not fp in pathinfo:
        err.fatal('Internal error, unable to fetch path data for file', fp)
    fdata = pathinfo[fp]
    source = None
    try:
        with open(fp, 'r+b') as f:
            source = f.read()
    except FileNotFoundError:
        err.fatal('Unable to find file:', target)
    except IOError as e:
        err.fatal('Unable to open file:', target)
    output = dsm.disassemble(source)
    print('Disassembly for file:', fp)
    print(output)
    if not env['logdsm']:
        return
    # Do this
    dest = env['dest']
    filename = fdata['name']
    if dest:
        # This is not portable (for now)...
        out = dest + '/' + filename + '.dis'
    try:
        with open(out, 'w') as f:
            f.write(output)
    except IOError as e:
        err.fatal('Unable to write file:', out)
示例#3
0
def _do_assemble_file(fp, env):
    pi = env['pathinfo']
    if not fp in pi:
        err.fatal('Internal error, unable to fetch path data for file', fp)
    fdata = pi[fp]
    source = None
    try:
        with open(fp, 'r') as f:
            source = f.read()
    except FileNotFoundError:
        err.fatal('Unable to find file:', target)
    except IOError as e:
        err.fatal('Unable to open file:', target)
    segments, ast = _do_build_segments(source)
    dest = env['dest']
    filename = fdata['name']
    if dest:
        # This is not portable (for now)...
        out = dest + '/' + filename + '.csm'
    else:
        out = filename + '.csm'
    try:
        with open(out, 'w+b') as f:
            for s in segments:
                f.write(s)
    except IOError as e:
        err.fatal('Unable to write file:', out)
    if env['dsegments']:
        print('Displaying generated byte segments for file:', fp)
        for s in segments:
            print('  ', str(s)[1:])
    elif env['dast']:
        print('Displaying generated AST for file:', fp)
        tv_display.visit(ast)
示例#4
0
文件: chasm.py 项目: londav28/chasm
def main():
    # Make sure to skip the first sys/argv value!
    argv = sys.argv[1:]
    files = []
    flags = []
    for arg in argv:
        if len(arg) == 1 and arg[0] == '-':
            err.fatal('Bad string while parsing flag:', arg)
        if arg[0] == '-':
            flags.append(arg)
            continue
        files.append(arg)
    env = cmd.env_init(files, flags, argv)
    entrypoint = env['entrypoint']
    entrypoint(env)
示例#5
0
def visit(node, env=None):
    result = None
    width = 0
    if not tt.has_immediate(node.opcode.toktype):
        if node.arg:
            err.fatal('Opcode:', node, 'cannot have arg:', node.arg)
        result = _validate_noi(node, env)
    else:
        for predicate, validator, bts in _immediate_lookup_table:
            if predicate(node.opcode.toktype):
                assert (node.arg)
                result = validator(node, env)
                width = bts
                break
    m = env['active-method-map']
    result.ins = m['ins']
    m['ins'] += width + 1
    m['inc'] += 1
    return result
示例#6
0
def env_init(files, flags, argv):
    result = _default_environment
    if not files and not flags:
        print(_usage_str)
        result['entrypoint'] = _entrypoint_soft_quit
        return result
    result = copy.deepcopy(_default_environment)
    result['files'] = files
    result['flags'] = flags
    result['argv'] = argv
    result['nofiles'] = len(files) == 0
    for fp in files:
        _env_attach_file_pathinfo(fp, result)
    for string in flags:
        if len(string) == 1 or string[0] != '-':
            err.fatal('Internal error, unable to parse flag', string)
        rawflag = string[1:]
        _parse_flag(rawflag, result)
    if (result['nofiles']) and result['gracefail']:
        result['entrypoint'] = _entrypoint_soft_quit
    return result
示例#7
0
def _handle_method_pragmas(node, env):
    k = node.id.value
    if not k in _method_pmap:
        err.fatal('Unrecognized method pragma:', node.id)
    m = env['active-method-map']
    ptype, pwidth, preq, pdefault = _method_pmap[k]
    # NOTE: Check to see if we don't take an arg.
    if node.arg and preq == _arg_n:
        err.fatal('Pragma', node.id, 'does not take value', node.arg)
        return
    if not node.arg and preq == _arg_y:
        err.fatal('Pragma', node.id, 'requires value')
        return
    if not node.arg and preq == _arg_n:
        v = True
        _insert_pragma_value(k, v, m)
        return
    if not node.arg and preq == _arg_o:
        v = pdefault
        _insert_pragma_value(k, v, m)
        return
    if node.arg:
        v = _parse_pragma_arg(node.arg, ptype, pwidth, env)
        _insert_pragma_value(k, v, m)
        return
    assert ('Should never reach here.' == None)
    return
示例#8
0
文件: parser.py 项目: londav28/chasm
 def _stop(self, msg):
     last = self._last()
     out = 'Parser expected ' + msg + ' but found ' + str(last)
     err.fatal(out)
示例#9
0
def _handle_object_pragmas(node, env):
    err.fatal('No object level pragmas yet.')
    return
示例#10
0
def _handle_module_pragmas(node, env):
    err.fatal('No module level pragmas yet.')
    return
示例#11
0
def visit(node, env=None):
    err.fatal('Unresolved jump while emitting segments:', node)
示例#12
0
def visit(node, env=None):
    err.fatal('Unclassified instruction while emitting segments:', node)
示例#13
0
def _parse_flag(rawflag, env):
    flag, arg = _split_flag_string(rawflag)
    if not flag in _flag_table:
        err.fatal('Unrecognized flag:', flag)
    if flag in env['switched']:
        return
    handler, no_files_reaction, takes_arg, argtype = _flag_table[flag]
    nfr = no_files_reaction
    nofiles = env['nofiles']
    if nfr < _n_skip or nfr > _n_ok:
        err.fatal('Internal error, bad no_files_reaction value:', nfr)
    elif nfr == _n_skip and nofiles:
        return
    # We will need to program a more robust error system soon.
    elif nfr == _n_err and nofiles:
        err.fatal('Flag', flag, 'requires input files!')
    elif nfr == _n_die and nofiles:
        err.fatal('Flag', flag, 'requires input files!')
    elif nfr == _n_ok:
        env['gracefail'] = True
    if arg and not takes_arg:
        err.fatal('Flag', flag, 'does not accept arg, found:', arg)
    if takes_arg and not arg:
        err.fatal('Flag', flag, 'expects arg of type:', argtype)
    parsed_arg = _parse_arg(arg, argtype)
    env['switched'][flag] = parsed_arg
    handler(parsed_arg, env)
示例#14
0
def _loop_through_files(action, env):
    files = env['files']
    if len(files) == 0:
        err.fatal('No input files provided!')
    for fp in files:
        action(fp, env)