我正在尝试编写MSBuild条件解析器。条件描述为here。
所以我想出了一个似乎工作正常的语法:
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”,并从另一端获得一个布尔值。
使用以下语言:
(!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 ++类集?我宁愿迷失在这方面。
我这样做纯粹是出于我自己的学习原因,所以我尽量不想使用别人的解析器库。
提前致谢!