标记 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_EXEC
和 T_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++ 解析器——它是图灵完备的。
我在做一个程序形式化验证的软件,用户定义一个用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_EXEC
和 T_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++ 解析器——它是图灵完备的。