Совпадение скобок и скобок легко.
string expression = "(a + b + (c + d) )";
int brackets = 0;
int parenthesis = 0;
foreach(char c in expression)
{
if(c == '(') ) parenthesis++;
if(c == ')') ) parenthesis--;
if(parenthesis < 0) { // ERROR!!! }
// Same logic with brackets
}
if (parenthesis != 0) { ERROR!!! }
Кроме того, я бы использовал аналогичный подход с «операторами слияния» (+, -, *, /) и «операторами сравнения» (==,! =, <, <=, ...) </p>
За каждым словом в вашем выражении могут следовать только несколько допустимых ключевых слов.
Как упоминалось ранее, написание синтаксических анализаторов - сложная задача, планирование любого случая исключения сразу вряд ли возможно. Это должна быть общая идея, а не окончательное решение.
В заключение отметим, что вполне нормально иметь несколько проходов для сканирования разных вещей. Первый проход - только скобки / скобки, затем проверка на что-то еще в другом цикле.