parsing - Evaluate a Special Expression in C# -
i have string have special substrings in special format:
$( variablename )
and pattern can repeat nested many times:
$( variablename $( anothervariablename ) )
such as: [ test string ]
here test string contain $(variablea) , $(variableb$(variablec))
for test string let assume that
$(variablea) = a, $(variableb) = b, $(variablec) = c, $(variablebc) = y
what want replace special patters -> $(variablename) actual values such resulting string should be:
here test string contain , y
any suggestion generic , elegant solution?
here straightforward solution performing recursive descent parsing:
public static string replace(     string input ,   ref int pos ,   idictionary<string,string> vars ,   bool stoponclose = false ) {     var res = new stringbuilder();     while (pos != input.length) {         switch (input[pos]) {             case '\\':                 pos++;                 if (pos != input.length) {                     res.append(input[pos++]);                 }                 break;             case ')':                 if (stoponclose) {                     return res.tostring();                 }                 res.append(')');                 pos++;                 break;             case '$':                 pos++;                 if (pos != input.length && input[pos] == '(') {                     pos++;                     var name = replace(input, ref pos, vars, true);                     string replacement;                     if (vars.trygetvalue(name, out replacement)) {                         res.append(replacement);                     } else {                         res.append("<unknown:");                         res.append(name);                         res.append(">");                     }                     pos++;                 } else {                     res.append('$');                 }                 break;             default:                 res.append(input[pos++]);                 break;         }     }     return res.tostring(); } public static void main() {     const string input = "here test string contain $(variablea) , $(variableb$(variablec))";     var vars = new dictionary<string, string> {         {"variablea", "a"}, {"variableb", "b"}, {"variablec", "c"}, {"variablebc", "y"}     };     int pos = 0;     console.writeline(replace(input, ref pos, vars)); }   this solution reuses implementation of replace built name of variable replace calling stoponclose flag set true. top-level invocation not stop on reaching ')' symbol, letting use unescaped.
Comments
Post a Comment