2016-08-14 5 views
0

正規表現を使用してカスタムパーサーを作成していますが、関数の一致方法を理解できません。Java RegEx - 引数リストの照合

私のカスタム言語における関数の例は次のとおりです。

function int add(int num1, int num2){ 
    return num1 + num2; 
} 

私のトークナイザは、次のトークンを取得し、それ以前供給されたソースコードの文字列からそれを削除する正規表現を使用しています。これは、関数の構文解析に関しては、コードが関数ステートメントで始まることを確信できます。それは非常に長いですが、それが正常にこの2つの関数と一致する

^([\s]*function[\s]+[a-zA-Z][a-zA-Z0-9]*[\s]+[a-zA-Z][a-zA-Z0-9]*[\s]*\(([\s]*[a-zA-Z][a-zA-Z0-9]*[\s]+[a-zA-Z][a-zA-Z0-9]*[\s]*)*\)[\s]*\{.*\}.*)$ 

::私は分割することができるようにしたい

function void log(string msg){ 
    Console.log(msg); 
} 

function int add(int num1 int num2){ 
    return num1 + num2; 
} 

を は、私は現在、次の式を持っています引数はカンマで区切ります。

  • 私はパラメータの後に必要なカンマを作ることができたが、その後、最後の パラメータはコンマで終わるだろう。

  • 私はパラメータの後に、オプションのカンマを作ることができるが、その後、ユーザはカンマを入れないことができるだろう

は、私はそうでない場合は、唯一のパラメータの間にカンマを必要とできるようにする必要がありますそれは後で私のパーサーを台無しにするでしょう。 引数間のコンマを探すように式を編集するにはどうすればよいですか?

ありがとうございます。

+0

カンマを追加する機能を正確に教えてください。 –

+0

それを忘れてしまった。正規表現を使用して文字列から個々のトークンを取り出すことはできますが、正規表現を使用して構文全体を解析することさえできません。1つは、正規表現を使用して可変数のパラメータを解析し、すべての情報を抽出する方法はありません。 – ajb

+0

'(int num1、int num2)'にマッチさせたいだけです。これはちょうど\ \(([\ s] * [a-zA-Z] [a-zA-Z0-9] * [\ s] + [a-zA-Z] [a-zA-Z0-9] * [\ s] *)* \) '。私はパラメータがコンマで分割されていることを確認する必要があります。 –

答えて

1

この正規表現は、文字列の(int num1, int num2)一部のために働く必要があります。

(\(
(?:  \s* 
    [^\s,]+\s+ 
    [^\s,]+\s*, 
)*  \s* 
    [^\s,]+\s+ 
    [^\s,]+\s* 
\)) 
0

あなたは3つの異なる可能性を持つと考えることができます:あなたが宇宙それをするとき

(\((?:\s*[^\s,]+\s+[^\s,]+\s*,)*\s*[^\s,]+\s+[^\s,]+\s*\)) 

それは読みやすいです:ゼロパラメータ、1つのパラメータ、および複数のパラメータ。次に、それぞれの異なる可能性についてor演算子を使用してチェックします。

つのパラメータ:

(?:\\w+\\s+\\w+) 

つのパラメータより多く:

(?:\\w+\\s+\\w+)(?:\\,\\s+(?:\\w+\\s+\\w+))+ 

ゼロパラメータ:

\\s* 

またはステートメント(上記のすべて)を使用して:

((?:\\w+\\s+\\w+)|(?:\\w+\\s+\\w+)(?:\\,\\s+(?:\\w+\\s+\\w+))+|\\s*)