c++ - Java中非常简单的C++词法分析

标签 c++ parsing compiler-construction lexical-analysis

我需要分析一些 C++ 源文件以生成一些非常基本的信息。我正在尝试做的事情是这样的:

  1. 假设我们有要分析的C++语法和C++源文件
  2. 分析器将像词法分析器一样读取源文件,它会识别 C++ 语法定义的关键字等。
  3. 分析器读取每一行后会输出如下信息: Line#:词法信息。例如,考虑一下:

    int main(int x, int y)
    {
       return x+y;
    }
    

程序会输出:

    Line 1: function: main, params: x, y
    Line 2: paren "{"
    Line 3: keyword: "return"

或类似的东西。

谁能告诉我该怎么做?我看过 Antlr 和 TXL,但我猜应该有更简单的方法。我想编写一个 Java 程序来完成这项工作。 我想做的第一件事是获取文件中的函数定义及其相应的行号。任何帮助将不胜感激。

谢谢, 安东

最佳答案

如果你想要你建议的输出,你就没有进行词法分析;您至少要进行一些解析,因为您必须了解您正在寻找的是函数声明与对象初始化。词法分析会给你类似的东西

int
main
(
int
x
,
int
y
)
{
return
x
+
y
;
}

而您想了解那些第一个标记实际上定义了一个函数。

不幸的是,解析 C++ 是出了名的困难,大多数解析器生成器都必须经过非常特殊的校准才能生成有效的 C++ 解析器。我建议查看现有的 C++ 解析器框架,可能类似于 Elsa。 .这将以您应该能够使用的格式为您提供所需的信息。另一种选择是直接连接到 C++ 编译器并处理底层 AST,它会为您处理所有解析和行号信息。 Treehydra工具在这里可能会有用,尽管您将编写 JavaScript 代码而不是 Java。

希望这对您有所帮助!

关于c++ - Java中非常简单的C++词法分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9145849/

相关文章:

c++ - 使用序列优雅地初始化静态(成员)数组

c++ - 如何锁定使用带有初始化列表的构造函数的类的成员函数

C++ - unique_ptr 的转换/更改类型

c++ - `fgetpos` 没有返回正确的位置

c++ - 您使用了哪些策略来缩短大型项目的构建时间?

java - 如何使用 Jericho 解析器设置用户代理

编写十六进制和十进制数的简单加法的约定

c - 如何在C中解析类似路径的字符串

c - 许多小型功能

c++ - C++ 上的预处理器重载