4

PLY の使用時に問題が発生しました。PLYでコールグラフジェネレーターを作りたいです。場合によっては、文法ファイル内のいくつかのトークンを破棄する必要があります。これは、トークンを破棄する前にパーサーがそのトークンを認識したときに何かを行う必要があるためです。そのため、レクサー ファイルで単に破棄することはできません。たとえば、「IF」トークンは破棄したいものです。それで、文法ファイルでそれを破棄するために何かをしようとします。と同じように:

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

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

4

2 に答える 2

1

あなたはこれを少し前に尋ねましたが、まだコメントも回答もありません。考えられる理由は次のとおりです。

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

つまり、フォークをトースターに突き刺しています。

内部データ構造をいじると、パーサーが混乱したり、パーサー ジェネレーターの次のバージョンで壊れたりするかもしれないと思いませんか? また、何をしようとしているのかを十分に説明していません。非終端記号を破棄する目的は何ですか?それは正確にはどういう意味ですか? それらの状況はどのようなもので、何が問題なのですか? パーサーオブジェクトを突っ込まなくても問題を解決できるかもしれません。

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

于 2012-03-06T22:17:19.807 に答える
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

Ⅱ.必要な関数で構文エラーを発生させます

def p_somerule(p):
' a : A '
raise SyntaxError
于 2012-03-10T14:28:32.610 に答える