On Mon, Jul 28, 2014 at 10:02 PM, Prathamesh Kulkarni <bilbotheelffri...@gmail.com> wrote: > I am having few issues replacing op in c_expr. > I thought of following possibilities: > > a) create a new vec<cpp_token> vector new_code. > for each token in code > { > if token.type is not CPP_NAME > new_code.safe_push (token); > else > { > cpp_token new_token = > ??? create new token of type CPP_NAME > with contents as name of operator ??? > } > } > > I tried to go this way, but am stuck with creating a new token type. > i started by: > cpp_token new_token = token; // get same attrs as token. > CPP_HASHNODE (new_token.val.node.node)->ident.str = name of operator. > CPP_HASHNODE (new_token.val.node.node)->ident.len = len of operator name. > name of operator is obtained from opers[i] in parse_for. > > however this does not work because I guess > new_token = token, shallow copies > the token (default assignment operator, i didn't find an overloaded version). > > b) create new struct c_expr_elem and use > vec<c_expr_elem> code, instead of vec<cpp_token> code; > > sth like: > struct c_expr_elem > { > enum c_expr_elem_type { ID, TOKEN }; > enum c_expr_elem_type type; > > union { > cpp_token token; > const char *id; > }; > }; > > while replacing op, compare token with op, and if it matches, > create a new c_expr_elem with type = ID, and id = name of operator. > This shall probably work, but shall require many changes to other parts > since we change c_expr::code. > > I would like to hear any other suggestions.
Together with the vector of tokens recorded at parse_c_expr time record a vector of token mappings (op -> plus, op2 -> ...) and do the replacement at code-generation time where we also special-case captures. Yeah, it's a but unfortunate that c_expr parsing is done the way it is done.... Richard. > Thanks, > Prathamesh.