我正在尝试编写一个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”,从而获得布尔值。
使用这种语言,以下内容:
(!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++类吗?我对此感到非常困惑。
我这样做纯粹是为了自己学习的原因,所以尽可能不想使用别人的解析器库。
提前致谢!