2017-03-22 9 views
-2

は、私はいくつかのCっぽい言語のためのメソッド呼び出しを保持している文字列を考えてみましょうパラメータがトップレベル関数(method1)に渡されていますか?リターン回数

上記の例では、私は4

の結果を探していることでしょう私も(それがタイプされています想像)メソッドが完了していない場合は正常に機能するには、このソリューションが必要です:

method1(var1, var2, method2(var3, meth

返す3.

私はそこantlrなどのツールを使用して言語を解析することですこれを行うには「正しい」方法を理解し、私は迅速かつ簡単solutがある願っていますこのためのイオン。

はそれで刺しを取った...

function findTopLevelParamCount(s){ 
 
    //trim top level function away 
 
    s = s.substr(s.indexOf('(')+1,s.lastIndexOf(')')-s.indexOf('(')-1); 
 
    console.log(s); 
 
    while(s.indexOf('(') >= 0){ 
 
     s = s.substr(0,s.indexOf('(')) + (s.indexOf(')')==-1?'':s.substr(s.lastIndexOf(')')+1)); 
 
     console.log(s); 
 
    } 
 
    return s.split(',').length; 
 
} 
 

 
var code = 'method1(var1, var2, method2(var3, method3(var4, var5)), var6);'; 
 
console.log(findTopLevelParamCount(code));

あなたの好奇心の場合は、これは署名ヘルプサポート

アップデートを提供していますvscode拡張のためであります

D署名が完了していない場合はうまくいきません。また、method1(var1, (var1-va2))のようなパレスチェスの分類で壊れます。

+1

私は自分のタイトルを知っていますか...プログラミング言語の概念に関連する問題を記述するのは難しい – NSjonas

+0

なぜこの質問はダウンボートになるのですか?問題の声明ははっきりしていて、私はすでに試したことに大きな詳細を列挙しました。そして@DouglasDaseecoなぜあなたはあなたの答えを削除しましたか?それは質問に追加され、他の人が役に立つと思うかもしれませんか? – NSjonas

+0

@FauChristianあなたは何について話していますか?私は "パーサー"を求めていません。私は、私が十分に定義した非常に単純な文法の出現回数を数える素早く汚い方法を具体的に求めました。問題は、非常に特定の問題を解決する方法を尋ねることです。前回私はそれがSOのガイドラインの範囲内にあることを確認しました。 あなたはあなたがやっているすべての仕事にこの過剰設計のアプローチを取っていますか? 最近、スタックのオーバーフローは非常に有毒なのですか? – NSjonas

答えて

2

/** 
 
* parse param count from string by specific level 
 
* @param String str  string to be parsed 
 
* @param Number level function call level, default as 1(top) 
 
* @return Number   param count 
 
*/ 
 
function parseParamCount(str, level){ 
 
    level = level || 1; 
 
    var ary = str.split(','); 
 
    var tokenLevel = 0; 
 
    var count = 0; 
 
    for(var i = 0, l = ary.length; i < l; i ++){ 
 
    var token = ary[i]; 
 
    // calc ')' length in token, then increase level by that 
 
    var startBracketMatch = token.match(/\(/g); 
 
    if(startBracketMatch){ 
 
     if(tokenLevel <= level)count++; 
 
     tokenLevel += startBracketMatch.length; 
 
    }else{ 
 
     if(tokenLevel === level)count ++; 
 
    } 
 
    
 
    // calc ')' length in token, then decrease level by that 
 
    var endBracketMatch = token.match(/\)/g); 
 
    if(endBracketMatch){ 
 
     tokenLevel -= endBracketMatch.length; 
 
    } 
 
    } 
 
    return count; 
 
} 
 

 
var test1 = 'method1(var1, var2, method2(var3, method3(var4, var5)),var6);'; 
 
var test2 = 'method1(var1, var2, method2(var3, meth'; 
 
var test3 = 'method1(method2(name), aaa)'; 
 

 
console.log(parseParamCount(test1)); 
 
console.log(parseParamCount(test2)); 
 
console.log(parseParamCount(test3));

だけTEST3用に更新

を試してみます。

+0

これは私の目的のために十分かもしれないと思います。今すぐテストしてください。 – NSjonas

+0

@brandonは、 'var test1 = 'method1(method2(name)、aaa);''では動作しません。 2の代わりに1を返します。 – NSjonas

+2

関数を更新しました。 – Bandon