我正在使用正式验证程序的软件,用户定义了一个用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
。但是我如何识别条件的哪一部分属于每个右括号?
这可能吗?我应该使用哪些工具?,你知道一些关于此的指南吗?
答案 0 :(得分:4)
Clang是去这里的唯一理智的方式。它是一个可以作为库调用的C ++编译器。您可以使用现有的C ++词法分析器,分析器和解析器来发现文件的内容。
即使你是一个解析器专家,只有一个疯狂的人会推出他自己的C ++解析器 - 它是Turing Complete。
答案 1 :(得分:1)
取决于您需要解析器的一般性。如果你想处理完整的C ++语法,你应该看看g ++和其他开源前端的词法分析器。
如果你能保证一个相对简单的语法,你就可以自己动手解决你自己的解析器。
但解析C ++非常困难 - 想想你需要知道的所有事情(模板定义,#define'd构造等等),所以如果你希望在一般情况下进行形式验证在适应现有的C ++词法分析器/解析器而不是尝试编写自己的C ++词法分析器时,你会好得多。