Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在C+中获取名称解析+;项目_Java_C++_Eclipse Cdt_Abstract Syntax Tree_Static Analysis - Fatal编程技术网

Java 在C+中获取名称解析+;项目

Java 在C+中获取名称解析+;项目,java,c++,eclipse-cdt,abstract-syntax-tree,static-analysis,Java,C++,Eclipse Cdt,Abstract Syntax Tree,Static Analysis,问题 我正在开发一个java 独立C++ 静态测试工具。在这个工具中,我需要在项目中获得名称解析。 例如,函数中有两条语句: int x = 0; int y = x + 1; 通过对第二条语句的变量x使用名称解析,我检测到它是在第一条语句中声明的 当前解决方案 首先,我使用EclipseCDT插件(只是CDT的一部分)创建抽象语法树(AST)。更清楚的是,将分析测试项目中的每个源代码文件,以构建相应的AST。但是,这些AST不包含名称解析。因此,我必须分析AST来检测名称解析。我目前的解决方

问题

我正在开发一个java <强>独立C++ <强>静态测试工具。在这个工具中,我需要在项目中获得名称解析。 例如,函数中有两条语句:

int x = 0;
int y = x + 1;
通过对第二条语句的变量x使用名称解析,我检测到它是在第一条语句中声明的

当前解决方案

首先,我使用EclipseCDT插件(只是CDT的一部分)创建抽象语法树(AST)。更清楚的是,将分析测试项目中的每个源代码文件,以构建相应的AST。但是,这些AST不包含名称解析。因此,我必须分析AST来检测名称解析。我目前的解决方案似乎不错,但对于大型项目和复杂结构,它肯定会失败

后来,我知道可以通过使用EclipseCDT自动获得有关名称解析的信息。但我需要创建一个独立的工具(在Eclipse之外),这意味着我无法将我的工具集成到CDT中

<>我知道C++使用静态名称解析而不是动态方法。因此,可以收集有关名称解析的信息。你能给我提些进一步的建议来解决我的问题吗

更新(基于以下建议)

有人建议我如下,我的回答

+使用叮当声

Clang支持分析C++文件(和C文件),不可否认Clang是一个不错的选择。但是,我想使用的语言是Java。目前,我只找到一个(例如EclipseCDT插件)。正如我所说,当我尝试在EclipseCDTIDE之外使用CDT插件时,它不支持名称解析

我目前的Java独立工具,即使用CDT插件解析C/C++程序。由于CDT插件的限制,我使用了一些简单的算法来分析名称解析。然而,这些算法在分析复杂项目的语法时失败了

C++是一种非常复杂的编程语言(与C语言不同)。解析它是一项非常困难的任务(如果你从头开始,那么你需要多年的工作——如果你一个人工作的话,可能需要一辈子的时间)

S>强>在现有的C++解析技术>之上构建工具。你可以使用,也许通过GCC,或(见),或前端等自由软件C++编译器是巨大的兽(数以百万计的线)不断发展和成长,掌握它们需要大量的工作。顺便说一下,可以使用通用(例如,或其他方法)或技术(例如)来使用来自java的C++编译器框架。 然而,我想使用的语言是Java

<> >强实用型。< /Stult>代码C++中的一小部分(上面的解析器,例如C++编译器),其余的在java中。p> (对于C++ C++ C++语言中的一个学术原型,使用C++中的一个合适的编译器和java中的一些工具之间的进程间通信可能比较困难,但是,C++中的代码复杂,而且在java方面需要更多的代码,所以你必须在代码中编译几千行代码,BTW,你可能需要在C++中进行一点实践。能够为它设计有用的东西……)

(因为你可能找不到完全的C++编译器或java中的前端)

即使将你的东西建立在现有的C++解析器之上,任务也不容易,而且可能耗费几个月的时间。现有的C++解析器正在进化(例如GCC的内部表示从一个版本到下一个版本略有变化)。因此,需要对这些解析器的演化进行预算。

解析C++本身是一个不明确的任务(考虑预处理、模板扩展等)。您需要定义C++相关代码表示的形式,当然C++有多个版本,等等。 也许你应该考虑问问你的经理(或者获得一些研究补助金,如果你是个学者)在这几年内全职工作。但是问问你自己是否值得……< / P >

可选地,如果您限制自己的C++项目,那么考虑一下定义一些特定于项目的约定,生成一些C++代码和其中的一些测试。 另一种方法(适用于Linux,但可能不适用于其他任何地方)是要求用户在启用调试信息的情况下进行编译(例如,如果用户使用

g++-g
),并解析调试信息


顺便说一句,我也做过类似的工作:几年前在,现在在我的github项目中(临时名称,将更改)。由于您的目标非常雄心勃勃,因此请确保获得几年全职工作的资金。

在您自己的解决方案中使用现有的广泛编译器,还有更多的事情要做,而不是实现过程中涉及的复杂性

C++现在是一种不断变化的语言。自从
C++11
以来,路线图每三年就会更新一次。他们对此感到恶心:我们的C++11、C++14、C++17和C++20已经步入正轨

仅仅为了跟上标准的变化,您将面临一个非常困难和耗时的挑战

例如,我向您展示了每个版本仅需要添加支持的一个更改。您/您是否愿意完全支持每个新的标准版本?或者,您是否将最终得到一个应用程序/工具,当它退出开发时,它已经过时了

C++98:

int x = 0;
int y = x + 1;
C++11:

auto x = 0;
auto y = x + 1;
C++14

C++17

C++20希望这样:

template <class T, class F, class P>
   requires requires(T x, F f, P p) {
       f(x);
       {p(f(x))} -> bool;
   }
auto bar(T x, F f, P p)
{
   //
}
模板
要求(TX,F,P){
f(x);
{p(f(x))}->bool;
}
自动条(T x,F F,P)
{
//
}
使用基于编译器(如gcc或clang)的解决方案,所有这些都由编译器自己处理。您只需将其用于自己的目的。

没有“C/C++”这样的东西。clang和g都有
if (const auto [iter, inserted] = mySet.insert(value); inserted)
template <class T, class F, class P>
   requires requires(T x, F f, P p) {
       f(x);
       {p(f(x))} -> bool;
   }
auto bar(T x, F f, P p)
{
   //
}