Я пытаюсь написать синтаксический анализатор условий MSBuild. Условия описаны здесь .
Итак, я придумала грамматику, которая работает нормально:
S -> !S
S -> S == S
S -> S != S
S -> S && S
S -> S || S
S -> Fn( str )
S -> str == str
S -> str != str
S -> n < n
S -> n <= n
S -> n > n
S -> n >= n
Это, кажется, соответствует моим потребностям, и я придумал набор классов C ++, которые определяют этот простой язык. то есть я могу создать классы таким образом, чтобы они подходили выше, а затем я могу вызвать «run» в выражении base и получить логическое значение на другом конце.
Используя этот язык следующее:
(!Exists( "C:\\config.sys" ) && 14 < 17) || (AString == AString2 && HasTrailingSlash( "C:" ))
становится определенным как (и простите за огромную строку кода!;)):
Statement baseStatement( new StatementOrStatement( new StatementAndStatement( new NotStatement( new ExistsFunctionStatement( "C:\\Config.sys" ) ), new NumberLessThanNumberStatement( 14.0, 17.0 ) ), new StatementAndStatement( new StringEqualStringStatement( "AString", "AString2" ), new HasTrailingSlashFunctionStatement( "C:\\" ) ) ) );
Я могу просто выполнить приведенное выше утверждение следующим образом:
const bool result = baseStatement.Run();
Пока что все в порядке. Кажется, я могу представить весь «язык», используя мою грамматику, и я могу встроить грамматику в действительное полное утверждение.
Однако теперь у меня есть следующая проблема. Мне нужно на самом деле разобрать строку. Я понятия не имею, с чего начать. Может ли кто-нибудь помочь мне в том, как я пишу фактический анализатор строк, чтобы разобрать исходный оператор в набор классов C ++ выше? Я довольно заблудился на этом фронте.
Я делаю это исключительно для собственных целей обучения, поэтому, насколько это возможно, я не хочу использовать чужую библиотеку парсера.
Заранее спасибо!