Tokenize c ++语句

时间:2015-01-06 18:16:05

标签: c++ parsing token tokenize

我正在使用正式验证程序的软件,用户定义了一个用C ++编写的算法进行验证。我不会过多地讨论主题的细节,我会尽可能清楚地表达我和我对它的看法。

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

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

然后我想以T_CONDITION的形式获得T_EXEC以及T_EXEC'Parts = [ COND => T_CONDITION, EXEC => [ T_EXEC, T_EXEC' ] ],其中T_CONDITION是整个条件,{{1如果条件为真,则程序执行的句子;如果程序进入T_EXEC语句,则为T_EXEC'。我认为这被称为" tokenizer"它是解析器的功能,但我不确定。问题是我对解析器一无所知。问题是我不知道条件和执行的开始或结束,然后我不能处理字符串操作。

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

else

然后我想得到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。但是我如何识别条件的哪一部分属于每个右括号?

这可能吗?我应该使用哪些工具?,你知道一些关于此的指南吗?

2 个答案:

答案 0 :(得分:4)

Clang是去这里的唯一理智的方式。它是一个可以作为库调用的C ++编译器。您可以使用现有的C ++词法分析器,分析器和解析器来发现文件的内容。

即使你是一个解析器专家,只有一个疯狂的人会推出他自己的C ++解析器 - 它是Turing Complete。

答案 1 :(得分:1)

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

如果你能保证一个相对简单的语法,你就可以自己动手解决你自己的解析器。

但解析C ++非常困难 - 想想你需要知道的所有事情(模板定义,#define'd构造等等),所以如果你希望在一般情况下进行形式验证在适应现有的C ++词法分析器/解析器而不是尝试编写自己的C ++词法分析器时,你会好得多。