标记 C++ 语句

Tokenize c++ statements

我在做一个程序形式化验证的软件,用户定义一个用C++写的算法来验证。在不过多讨论主题细节的情况下,我会尽可能清楚地表达我的想法和想法。

如果用户输入以下形式的内容:

int foo ( [arg1,...,argN] ) {
    if ( T_CONDITION ) {
        T_EXEC;
    }
    else {
        T_EXEC';
    }
}

然后我想以 Parts = [ COND => T_CONDITION, EXEC => [ T_EXEC, T_EXEC' ] ] 的形式获得 T_CONDITION 以及 T_EXECT_EXEC',其中 T_CONDITION 是整个条件 T_EXEC 是程序在条件为真时执行的语句,T_EXEC' 如果程序进入 else 语句。我认为这叫做 "tokenizer" 并且它具有解析器的功能,但是 我不确定 。问题是我对解析器一无所知。问题是我不知道条件和执行从哪里开始或结束,所以我无法处理字符串操作。

一旦我有了T_CONDITION,我需要以这样的方式分解它以获得几个原子逻辑公式。类似于:

T_CONDITION = ( ( A OR N ) OR ( B AND C ) OR ( D AND ( E  OR F ) ) )

那我想得到CONDITION_PARTS = [ [ A ], [ N ], [ B , C ], [ D, [ [ E ], [ F ] ] ] ] 这是:如果我得到 A or B,那么我需要 PART = [[A],[B]],如果我得到 A and B,那么我需要 PART = [A,B]。但是我如何识别条件的哪一部分属于每个右括号?

这可能吗?,我应该使用什么工具来做?,你知道一些关于这方面的指南吗?

取决于您需要解析器的通用性。如果你想处理完整的 C++ 语法,你应该看看 g++ 和其他开源前端中的词法分析器。

如果你能保证语法相对简单,你就可以推出自己的解析器。

但是解析 C++ 非常困难——考虑所有您需要知道的事情(模板定义、#define 构造等......),所以如果您希望在一般情况下,您最好采用现有的 C++ lexer/parser 而不是尝试编写自己的 C++。

Clang 是唯一明智的方法。它是一个 C++ 编译器,您可以将其作为库调用。您可以使用他们现有的 C++ 词法分析器、分析器和解析器来发现文件的内容。

即使您是解析器专家,也只有疯子才会推出自己的 C++ 解析器——它是图灵完备的。