С точки зрения формальных языков и грамматик ИМХО есть два основных аспекта. Прежде всего, грамматика для вашего языка должна относиться к какой-то легко обрабатываемой категории. Например, язык с контекстно-свободной грамматикой, что означает, например, В вашем языке слишком много элементов, количество которых зависит друг от друга, например, в открытых и закрытых скобках, для анализа может потребоваться бесконечно много памяти. C ++ имеет контекстно-зависимую грамматику, что еще хуже, примером может быть грамматика, имеющая три элемента с взаимозависимыми значениями. Другой аспект связан с неоднозначностью при разборе. В неоднозначной грамматике вы можете анализировать один и тот же текст по-разному, что означает, что вы должны найти правильный путь для вашего алгоритма синтаксического анализа - большинство из них вообще не допускают двусмысленности.
Я не совсем уверен, но я бы сказал, что синтаксический анализ скобок и пробелов (при разумном определении) одинаково сложен. В обоих случаях вам понадобится счетчик для проверки уровня вложенности блоков, однако, используя пробелы, вы можете определить уровень локально (подсчитав пробелы), и вы можете быть уверены, что ваш счетчик не упадет ниже нуля, что может произойти, когда вы иметь больше закрывающих скобок, чем открывающих.