Написание простого синтаксического анализатора условий MSBuild - PullRequest
3 голосов
/ 18 ноября 2010

Я пытаюсь написать синтаксический анализатор условий 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 ++ выше? Я довольно заблудился на этом фронте.

Я делаю это исключительно для собственных целей обучения, поэтому, насколько это возможно, я не хочу использовать чужую библиотеку парсера.

Заранее спасибо!

...