我正在尝试编写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++类吗?我在这条战线上迷路了。
我这么做纯粹是出于我自己的学习原因,所以我尽量不想使用其他人的解析器库。
提前谢谢!