--- eso.py- 2016-09-19 00:00:00.000000000 +0900 +++ eso.py 2016-09-20 00:00:00.000000000 +0900 @@ -231,6 +231,12 @@ def tree_kwd(lst, kdic): r = tree_kwd( lst[2:], kdic ) e = [ k, v, lst[1], r.pop(0) ] return [ e ] + r + if v == 'struct': + (name, i) = ( lst[1][1], 2 ) if lst[1][0] == 'name' else (None, 1) + (body, i) = ( lst[i], i+1 ) if lst[i][:2] == [ 'br_s', '{' ] else (None, i) + e = [ 'struct', name, body ] + e = [ 'type' if lst[i][0] == 'name' else 'sdef', e ] + return step(e, i) e = e[:2] + tree_kwd( e[2:], kdic ) return step(e, 1) @@ -308,7 +314,7 @@ def es_split(s): 'br_e' : [ ')', ']', '}' ], 'op' : ops_flat, 'type' : [ 'int', 'char', 'void', 'double' ], - 'kwd' : [ 'return', 'if', 'else', 'while', 'for', 'break', 'continue' ], + 'kwd' : [ 'return', 'if', 'else', 'while', 'for', 'break', 'continue', 'struct' ], 'spc' : [ ' ', '\t', '\n' ], 'etc' : [ ';' ], 'no_spc': [ '.0', '.1', '.2', '.3', '.4', '.5', '.6', '.7', '.8', '.9' ], @@ -408,6 +414,12 @@ def do_set(e, val, info): arr = get_arr_with_chk(v, i, info) arr[i] = val return val + if e[:2] in [ [ 'op', '.' ], [ 'op', '->' ] ]: + name = e[2][1] # [ 'name', xxx ] + memb = e[3][1] # [ 'name', xxx ] + d = get_val(name, info) + d[memb] = val + return val warn_no_sup('do_set', 'k', k) @@ -438,6 +450,8 @@ def do_op2(v, a, b, info): a = do_expr(a, info) if v == '?': return do_expr(b[2] if a else b[3], info) + if v in [ '.', '->' ]: + return a.get( b[1] ) # b == [ name, xxx ] b = do_expr(b, info) if v == '=': return do_set(oa, b, info) @@ -608,6 +622,8 @@ def do_type(expr, info): val = do_type_arr(e, val, info) elif val: val = do_expr(val, info) + elif expr[1][0] == 'struct': + val = {} name = e[1] new_val(name, val, info) return None @@ -643,7 +659,7 @@ def do_expr(expr, info): if k == 'type': return do_type(expr, info) - if k in [ 'fproto', 'etc', 'fdef' ]: # do nothing !!! + if k in [ 'fproto', 'etc', 'fdef', 'sdef' ]: # do nothing !!! return None warn_no_sup('do_expr', '[k, v]', [k, v])