代码之家  ›  专栏  ›  技术社区  ›  Goz

编写简单的MSBuild条件分析器

  •  3
  • Goz  · 技术社区  · 14 年前

    我正在尝试编写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++类吗?我在这条战线上迷路了。

    我这么做纯粹是出于我自己的学习原因,所以我尽量不想使用其他人的解析器库。

    提前谢谢!