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.

Reply via email to