2010-12-29 9 views
4

私は下のツリーを生成することになる、リスト演算にいくつかの文を解析することができ、bleadperlに新parse_block機能とオペコードのリストを含むパッケージにCVをどのように割り当てるのですか?

をプレイされています:

LISTOP (0x1002a00c0) leave [1] 
    OP (0x1002d6220) enter 
    COP (0x1002a0b80) nextstate 
    OP (0x10028c0f0) null 
    LISTOP (0x1002a0170) print 
     OP (0x1002b1a90) pushmark 
     SVOP (0x100327ee0) const PV (0x100826ec0) "hello\n" 
    COP (0x1002a0c50) nextstate 
    LISTOP (0x100324ee0) print 
     OP (0x100327880) pushmark 
     SVOP (0x100324eb0) const PV (0x100897688) "world\n" 

私は構文木へのポインタを返す必要があります私のキーワードプラグインの構造は、現時点では操作の裸のリストを含んでいます。私はサブルーチンの中にこれらの関数をラップし、それを隠しの中のシンボルに割り当てたいと思います。

だから、私はこのような何かをしたいと思います:

$ perl -MO=Terse -e "*foo = sub { print 'my listops here' }" 

LISTOP (0x10022b5e0) leave [1] 
    OP (0x10022b620) enter 
    COP (0x10022b590) nextstate 
    BINOP (0x100202090) sassign 
     UNOP (0x1002083d0) refgen 
      UNOP (0x100208360) null [146] 
       OP (0x1002083a0) pushmark 
       SVOP (0x100208330) anoncode [1] CV (0x100826d40) 
     UNOP (0x1002085a0) rv2gv 
      SVOP (0x100208550) gv GV (0x100826d28) *foo 

おそらく、私は私のlistopsの開始時と終了時entersub、leavesubを追加する必要がありますが、私は、私はこれを構築して行くだろうかわかりませんXSで?結果のoptreeをCVに変換する方法もわかりません。

xsubsではCVを生成し、optreesではCVを生成しない例があります。

ありがとうございました。

答えて

0

私はevalが内部的に何をしているかを見ています。特に、op.cとPerl_newPROG(OP * o)は開始するのに適しているかもしれません。

void 
Perl_newPROG(pTHX_ OP *o) 
{ 
    ... 
    PL_eval_root = newUNOP(OP_LEAVEEVAL, 
        ((PL_in_eval & EVAL_KEEPERR) 
       ? OPf_SPECIAL : 0), o); 
    PL_eval_start = op_linklist(PL_eval_root); 
    PL_eval_root->op_private |= OPpREFCOUNTED; 
    OpREFCNT_set(PL_eval_root, 1); 
    PL_eval_root->op_next = 0; 
    CALL_PEEP(PL_eval_start); 
    ... 
関連する問題