2011-07-05 14 views
2

ちょっと私はカスタムスクリプト言語を使っています。私はC言語でこの言語用の一種のIDEを作っています。この言語での関数は次のように定義されています。私は、正規表現を介したすべての関数のリストを取得するための最良の方法を把握しようとしてきたし、リストを取得するための作業方法を見つけることができませんでした正規表現で関数を見つける最良の方法は?

yourfunctionhere(possiblepararmhere) 
{ 
    yourcodehere; 
} 

定義されたすべての機能の誰かより良い方法や正規表現でやる方法を教えてもらえますか?どうもありがとう!

編集: C#ではこのようなことはありますか?

def yourfunctionhere(possiblepararmhere) 
{ 
    yourcodehere; 
} 

次にあなたがdef [a-zA-Z0-9]+のような単純な正規表現を使用することができます:あなたはあなたの宣言になるので、「DEF」などの予約されたキーワードを追加して、構文を変更した場合%[a-z_0-9^[^]*]++ [a-z_0-9*^[^]]+[ ^t]++[a-z_0-9*^[^]]+[ ^t]++^([*a-z_0-9]+^)[ ^t]++([^p*&, ^t^[^]a-z_0-9./(!]++)[~;]

+0

[正規表現をネストされたパターンに一致させることはできますか?](http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested-patterns) – jtbandes

+1

あなたの言語について深刻な人は、正規表現ではなく、レクサー/パーサーのペアを使用する必要があります。 –

+0

私はこれをするかもしれません、提案していただきありがとうございます。 – user556396

答えて

4

あなたはこのような何かが働くかもしれない関数名のリストが必要な場合:

Regex.Matches(source,@"([a-zA-Z0-9]*)\s*\([^()]*\)\s*{").Cast<Match>() 
    .Select (m => m.Groups[1].Captures[0].Value).ToArray() 

基本的には、その正規表現は、オプションの空白が続く英数字の任意のグループ、探している、開き括弧の後、続いて0個以上のカッコで囲まれた後に閉じ括弧が続き、続いてオプションの空白が続き、次に中かっこが開きます。

次に、最初の部分だけを抽出してリストを作成します。言い換えれば、閉じ括弧の後ろに括弧をつけることができないと仮定すると、上記はうまくいくはずです。さもなければより多くの細部が必要となります。

+0

私は上記のコメントアウトされた関数をキャッチし、文字列内の関数定義のようなものをキャッチすることに注意する必要があります。行く最善の方法は、パーサを持つことです。問題の言語に関する正式な文書が存在する場合は特にそう難しいものではありません。仕様にBNFなどの文法が含まれている場合、その仕事はかなり単純な翻訳になります。 –

0

は、それははるかに容易になるだろう。

+0

私もこれを考えていました。それが私がこのような困難な時を過ごしていた理由です。残念ながら、私はスクリプト言語を変更する能力がありません。 – user556396

+0

また、単純な正規表現は機能しません(文字列リテラルでは "def ..."と考える)。ドラゴンブック(http://en.wikipedia.org/wiki/Compilers:Principles,_Techniques,__Tools)は、この件に関する権威です。 – Hut8

関連する問題