2011-02-02 16 views
1

私はPLY (python implementation of yacc)というかなり単純な文法を書こうとしています。私が望むときにトークンの文字列を減らすためにyaccを得るのに問題があります。yaccが減らすことができません(Python Lex-Yacc)

さまざまな種類の引数を取る一連のコマンドを解釈したいと考えています。異なる種類の引数にはそれぞれ異なるトークンがあります。私はyaccinstructionと呼ばれるルールにこれらの行のそれぞれを減らしたい

COMMAND VARARG VARARG STRARG 
COMMAND VARARG STRARG STRARG 

lexから出てきたトークンの文字列は次のようになります。ただし、yaccは、最後の引数(STRARG)の後に最初の行を減らすのを拒否し、予期しないCOMMANDトークンのために構文エラーを生成します。代わりに(読まれていないはずの次の行から最後COMMANDを拾う)COMMAND VARARG VARARG STRARG COMMANDを取得するにはCOMMAND VARARG VARARG STRARGyaccinstructionに移行する1つのより多くの時間を短縮することで、ある

私のコードのyacc部分は次のようになります。

def p_rule1(p): 
    r'instruction : COMMAND VARARG VARARG STRARG' 

    # do stuff 

def p_rule2(p): 
    r'instruction : COMMAND VARARG STRARG STRARG' 

    # do other stuff 

は、私は私のルールの仕様にいくつかの明白な誤りがいるのでしょうか? lex/yaccを初めて使用したので、私は驚かないでしょう。

答えて

1

複数の命令を処理するための追加の規則を含める必要があります.yaccはその2番目のCOMMANDトークンで何をすべきかを知っています。以下のようなものが動作するはずです。

instructions : instructions '\n' instruction 
      | instruction 

instruction : COMMAND VARARG VARARG STRARG 
      { do stuff } 
      | COMMAND VARARG STRARG STRARG 
      {do other stuff } 

私はそれが使用されることは決してありません私のコードにそのルールを追加するとき、残念ながらhttp://luv.asn.au/overheads/lex_yacc/yacc.html#recusive

+0

を参照してください。私はこれがまだ 'instruction'に何も減らさないので、' instructions'ルールはスタックに 'instruction'を見ることはないと考えています。 (新しいルールで)デバッグをオンにすると、スタックの進行状況は 'COMMAND' - >' COMMAND VARARG' - > 'COMMAND VARARG VARARG' - >' COMMAND VARARG VARARG STRARG' - > 'COMMAND VARARG VARARG STRARG COMMAND 'のようになります。 '(余分な' COMMAND'のためにここでは失敗します)。 'yacc'は最後の' COMMAND'をシフトする前に 'COMMAND VARARG VARARG STRARG'を' instruction'に減らしてはいけませんか? – Ael

+0

また、PLYで 'instructions'ルールを実装した方法は次のとおりです: ' def p_instructions(p):r '' 'instructions:instructions'命令 '' 'パス' – Ael