В зависимости от вашей полной грамматики у вас есть несколько вариантов: если это очень простая грамматика и вам не нужно проверять на наличие ошибок в ней, вы можете просто перейти к следующему (что будет быстро)
var input = "(params (abc 1.3)(sdc 2.0)(www 3.05)....)";
var tokens = input.Split('(');
var typeName = tokens[0];
//you'll need more than the type name (assembly/namespace) so I'll leave that to you
Type t = getStructFromType(typeName);
var obj = TypeDescriptor.CreateInstance(null, t, null, null);
for(var i = 1;i<tokens.Length;i++)
{
var innerTokens = tokens[i].Trim(' ', ')').Split(' ');
var fieldName = innerTokens[0];
var value = Convert.ToDouble(innerTokens[1]);
var field = t.GetField(fieldName);
field.SetValue(obj, value);
}
этот простой подход, однако, требует хорошо соответствующей строки, иначе он будет плохо себя вести.
Если грамматика немного сложнее, например, nested (), тогда этот простой подход не будет работать.
вы можете попытаться использовать regEx, но для этого все еще требуется довольно простая грамматика, поэтому, если у вас сложная грамматика, ваш лучший выбор - настоящий парсер. Ирония проста в использовании, поскольку вы можете написать все это на простом c # (хотя некоторые знания BNF являются плюсом).