rc = FUNCA ( a , b ) ; の引数は a と bです。 rc = FUNCB ( FUNCA(a,b) , c) の引数は FUNCA(a,b) と c の二つです。 同様に FUNC_x( xx, x,,,(((....))),,,,) と幾らでも入れ子にできます。 この文字列を 、アプリケーションで処理する時、少し面倒です。 "(" に対応する")"を見つけるのは、順次読み飛ばして行くのが確実でしょう。 字句解析を作りこむのは大層で、少し面倒です。 正規表現でなんとか処理できないでしょうか。字面処理なので、できないように思われがちです。 しかし、ネストカウント処理が可能です。 .net.Framework方言では
(?'TITLE'[^\(\)]*)(((?'O'\()[^\(\)]*)+((?'C-O'\))[^\(\)]*?)+)*(?(O)(?!))
です。Unix系では別の書式のようです。(不案内ですがwww)
今回は 、次の文字列を分解してみました。
Func_A ( FuncB( a , b ) , Func_C( a , b , c) , Func_D( Sin(30) , cos(40) ) , 漢字 )
http://www.ognogn.com/Regex/Analize_Argument.aspx
結果は
関数 :Func_A
引数 : FuncB( a , b ) , Func_C( a , b , c) , Func_D( Sin(30) , cos(40) ) , 漢字
関数 :FuncB
引数 : a , b
関数 : Func_C
引数 : a , b , c
関数 : Func_D
引数 : Sin(30) , cos(40)
関数 :Sin
引数 : 30
関数 : cos
引数 : 40
となり、目的は達します。構文解器を作らなくても、ここまでできます。
開き括弧に対応する閉じ括弧で開始括弧を置換するので「(?'C-O'~」は「Oから此処までの文字列をCに入れる」(コメント参照)、再帰に不慣れだと戸惑いますが、便利なものです。
下手に説明するよりソースを見るほうが、一目瞭然でしょうから、小汚いソースを載せておきます。