2012-02-27 3 views
3

PLYを使用するときに問題が発生しました。 PLYでコールグラフジェネレータを作成したいと思います。 状況によっては、文法ファイル内にトークンをいくつか破棄する必要があります。 これは、パーザがそのトークンを破棄する前にそれを認識するときに何かする必要があるからです。 私はlexerファイルで破棄することはできません。 たとえば、 'IF'トークンは破棄したいトークンです。 文法ファイルでそれを破棄する何かをしようとします。 ただ好き:PLY(Python Lex-Yacc)で文法ファイルで非終端記号を破棄する方法

def p_if(p): 
    'if : IF' 
    print "if" 
    parser.symstack.pop() 

しかし、物事は私が考える方法を行きませんでした。 symstackを出力します(これはパーサの属性です。パーサはyacc.pyのLRParserインスタンスです)。 symstackのリストには前のトークンが含まれていますが、 'if'は含まれていません。 このような状況でトークンを破棄する方法は不思議です。 誰か助けてくれますか?どうもありがとう!

答えて

0

ありがとうございます! 実際、私は自分の問題を解決する方法を見つけました。 そうです、parser.symstackは決して操作するべきではありません。 私の英語は良くないので(私の母国語は英語ではありません)、私は 私の問題ははっきりと説明していませんでしたが、私はあなたの助言に感謝します。 私の解決策は次のとおりです。これが将来他の人に役立つことを願っています。

I. p_error(P)関数

def p_error(p): 
tok = yacc.token() # Get the next token 
yacc.errok() 
return tok #Return the next token 

IIを定義します。必要な機能で構文エラーが発生する

def p_somerule(p): 
' a : A ' 
raise SyntaxError 
1

あなたはもう少し前に尋ねましたが、コメントや回答はまだありません。なぜここに説明があるのでしょうか。

私はhttp://www.dabeaz.com/ply/ply.htmlのドキュメントを見ています。 parser.symstackを操作する方法はありません。公開された、文書化されたインターフェースではないようです。

I.e.あなたはトースターにフォークを貼っています。

内部データ構造が混乱している場合や、パーサージェネレータなどの次のバージョンで破損する可能性がある場合は、パーサーが混乱するかもしれませんか?また、あなたがしようとしていることを十分に説明していない。非終端記号を捨てる目的は何ですか?それはどういう意味ですか?そのような状況は何であり、何が問題なのですか?多分、問題はパーサーオブジェクトを突き刺すことなく解決することができます。

また、文書化されたグローバルパーサーオブジェクトもありません。このパーサ変数をこの "parser = yacc.yacc()"(セクション7:複数のパーサとレクサーで説明)のように定義しておく必要があります。パーサのルール自体でこの変数を参照するので、非常にクルージングに見えます。ルールがパーサーを参照するための適切な方法があります。それは、受け取るpパラメータです.p.parserが必要です。 (セクション7で再び文書化されている)。

関連する問題