2012-02-10 17 views
1

私はcStyleComment変数を利用したいと思いますが、これらのコメントを無視するのではなく、特別に処理したいと思います。 pyparsingを入力の部分にハンドラを呼び出すようにする方法はありますか?それは、それが捨てられる前にコメントとして認識されます。Pyparsing:Cスタイルのコメントの特別な処理を実装する方法は?

私はいくつかのCコードを処理していますが、コメントの中にはいくつかの "特別な"指示文が含まれています。

答えて

2

pyparsingで定義されている式のうち、無視される式には何も固有のものはありません。特に、いくつかのコメント形式が間違っているので、便利です。

cHeaderParser.ignore(cStyleComment) 

cHeaderParserは、あなたは、例えば、APIの情報を抽出するために.hファイルを通読するために書いたものになるかもしれないところ。):あなたが大きな文法上のignoreメソッドを呼び出さない限り、彼らはのように、無視されません。

ハンドラへのParsarsingコールバックを組み込んでいる場合は、cStyleComment.setParseAction(commentHandler)を使用してください。 Pyparsingは、これらの署名のいずれかと行動を解析処理することができます:あなたのcommentHandlerが文字列または文字列、または新規ParseResultsのリストを返す場合

def commentHandler(inputString, locn, tokens): 
def commentHandler(locn, tokens): 
def commentHandler(tokens): 
def commentHandler(): 

、これらは、入力トークンを置き換えるために使用されます - それはNoneを返した場合、またはreturn文を省略すると、tokensオブジェクトが使用されます。トークンオブジェクトを変更することもできます(新しい結果名を追加するなど)。このような変換解析アクションを記述する場合は(このような単純な解析アクションさえcStyleComment.setParseAction(lambda t:t[0].upper())を書くことができます)

def commentHandler(tokens): 
    return tokens[0].upper()  
cStyleComment.setParseAction(commentHandler) 

はつまり、あなたのコメントを大文字になり、このような何かを書くことができます、一つはおそらくこれは、Tを出力しますparseString

print cStyleComment.transformString(source) 

いうしtransformStringを使用します元のソースだが、すべてのコメントが大文字になる。

+0

ありがとう、transformString()は私のためのトリックでした!私は今2パスを使用します。最初のものは、@ annotationや@annotation(value)のようなものだけを残すために 'cStyleComment.setParseAction(processComments).transformString(src)'ですが、残りのコメントを投げ捨てて、次に 'parseString()私の主な文法では。私はわずかに注釈を2回処理しなければならないことを嫌います。最初はreモジュールを使用してそれらを抽出しますが、parseString()呼び出し中に2回目の処理のみを行うようにそれらを元の文字列に連結し直します。それでも、それは動作します! – rincewind

+0

必要に応じて、cStyleCommentに添付した解析アクション内の注釈を解析して、1回のパスで試してみることができます。しかし、仕事を終わらせる解決策で議論するのは難しいです。おめでとう、そして鑑定へようこそ! – PaulMcG

関連する問題