【问题标题】:Tokenize c++ statements [closed]标记 C++ 语句 [关闭]
【发布时间】:2015-01-06 18:16:04
【问题描述】:

我正在使用一种程序形式验证软件,其中用户定义了一个用 C++ 编写的算法来进行验证。在不过多讨论主题的细节的情况下,我将尝试尽可能清楚地表达我的想法和对它的想法。

如果用户输入了某种形式的内容:

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

然后我想得到T_CONDITIONT_EXECT_EXEC',形式为Parts = [ COND => T_CONDITION, EXEC => [ T_EXEC, T_EXEC' ] ],其中T_CONDITION是整个条件,T_EXEC是程序在条件下执行的语句如果程序进入else 语句,则为真和T_EXEC'。我认为这被称为“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]。但是我如何识别条件的哪一部分属于每个右括号呢?

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

【问题讨论】:

  • 不要重新发明轮子:Clang tooling.
  • 这不是对特定场外资源的请求(这将是题外话)。这是询问工具的类别是如何命名的,确实有一个客观的答案。您可以看到这一点,因为该问题已经包含一个潜在的(但不正确的)答案“tokenizer”。

标签: c++ parsing token tokenize


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

  • 你知道适合我的解析器吗?
  • @Tomirammstein:查看 Angew 的评论。
猜你喜欢
  • 1970-01-01
  • 2018-03-23
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多