编写一个简单的MSBuild条件解析器

3

我正在尝试编写一个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++类吗?我对此感到非常困惑。

我这样做纯粹是为了自己学习的原因,所以尽可能不想使用别人的解析器库。

提前致谢!


你最终解决了这个问题吗?我对结果很感兴趣。 - C.J.
1个回答

2

谢谢,我在大学学习了一门语言处理器课程...但那是13年前的事了...我已经完全忘记了像“递归下降”这样的解析器名称。这给了我一个开始寻找的方向。不过,我仍然希望能够得到更明确的指导:D - Goz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接