- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试分析 Java 代码结构。
因此,我使用 ANTLRv3 和 java 语法代码生成了 Java 解析器和词法分析器...
但我不知道如何使用生成的解析器和词法分析器生成上下文流图。
我试图通过教程页面了解如何执行此操作,但教程页面已经消失了。
你能告诉我如何做到这一点吗?还是教程页面?
谢谢。
最佳答案
据我所知,ANTLR 在构建控制流图方面没有提供具体的帮助。
您可以自己构建一个,方法是遍历 AST,收集操作(无条件语句)和条件(表达式节点控制条件)的知识,并根据该信息组装图形。请注意,switch 语句是一种复合条件,需要作为一组决策或特殊的 N 路条件来处理。
异常处理可能会改变您对“无条件操作”的看法;每个方法调用都有可能将控制流重定向到异常处理程序(或函数的导出),您需要决定是否要将这些包含在您的控制流图中。如果您想推断程序的作用(尤其是数据流),则需要对这些进行建模。
您将需要创建控制流节点(只是一种类),可以引用 AST 的片段(“这就是操作”)和其他两个控制流节点(处理 if-then-else) ;这些导出中的这个作为“真实导出”和“虚假导出”或者“继续”和“陷阱”导出。它的子类将表示纯计算、IF 语句、TRY block 等。
Java 是一种纯粹的“结构化”语言这一事实意味着您可以“自下而上”地构建控制流图;您可以在向上遍历叶子时构建控制流图的位,并在爬树时组合来自 child 的控制流图。您需要做的是将到目前为止组装的控制流图(最初在叶子上为空)传递到树中,并引用该图中要将控制权传递给异常处理程序的控制流节点列表。然后当你爬树时,扩展控制流图。
大部分工作发生在条件条件下,例如 IF-THEN-ELSE 节点;在这种情况下,带有两组异常的两个控制流子图被传递到该节点。然后创建一个控制流节点来表示条件,将其操作设置为指向条件表达式,将其两个子节点设置为指向传入的两个子图,并将其异常集设置为异常集的并集。
子程序调用获取其 Action 为方法调用的流节点,有一个导出到后面的语句/子表达式,另一个导出(未填充)最终将指向 catch 子句。将子程序调用节点添加到向上传递的异常列表中。
类似地对待 THROW 语句,尽管它们没有“下一步”操作。
当你遇到一个 TRY 构造时,生成一个条件节点,其中 action 指向 try 主体,一个 exit 指向 try 结束或 finally 子程序调用。最后,修补异常列表中的所有控制流节点以指向 catch 子句。
您需要将 catch 子句链接在一起作为一系列 if 语句。
您必须将“finally”视为子例程调用,从 try 子句和各种 catch 子句调用。
关于java - 我如何使用 antlr 生成 Java CFG(控制流图)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9988541/
我有一个Java项目,正在使用hibernate。这里的事情是我想将hibernate.cfg.xml文件放在“src”文件夹之外,但是当我配置该文件时,它显示FileNotFoundExceptio
我想了解 #[cfg(test)] 和 #[cfg(feature = "test")] 之间的区别,最好通过示例进行演示。 最佳答案 #[cfg(test)] 标记仅当启用 test 配置选项时才编
如果我启动 cppcheck,我会收到以下错误: cppcheckListLib.c(信息)无法加载 std.cfg。您的 Cppcheck 安装已损坏,请重新安装。 Cppcheck 二进制文件是在
我想了解 #[cfg(test)] 和 #[cfg(feature = "test")] 之间的区别,最好通过示例进行演示。 最佳答案 #[cfg(test)] 标记仅当启用 test 配置选项时才编
当我来的时候,我正在寻找一个很好的解决方法来保持我的 .tmux.conf 文件在系统之间保持一致(我有 OS X 和 Ubuntu,它们有不同的复制/粘贴支持技术)在这条提供解决方案的评论中:htt
所以我有这个主 package Hibernate; import java.util.List; import org.hibernate.Session; import org.hibernate
我的项目根文件夹中有hibernate.cfg.xml文件。 如果我运行的应用程序包含: SessionFactory sessionFactory = new Configuration().con
我收到上述错误。我的 Web 应用程序中已有 xml 文件 hibernate.cfg.xml。除此之外,我在 WebINF lib 文件夹下有 hibernate 所需的完整 jar 文件。 这是完
我在 IntelliJ IDE 中的 hibernate.cfg.xml 有问题。 这是我的 hibernate 配置文件: org.postgresql
我正在尝试使用 pgadmin3 连接到 ubuntu 中的 Postgresql9.1。我的 Pgadmin3 GUI 工具没有提供任何通过右键单击数据库来创建表的选项,但它在我看到的一些视频中可用
您好,我的项目 CFG 文件中的路径列表太长,我如何定义像 $(BDS) 这样的路径快捷方式谢谢 最佳答案 “选项”对话框 ->“环境选项”->“环境变量”。该页面有一个“用户覆盖”部分。这就是您定义
对于 LR 解析器,FIRST 集定义如下 ( source ): FIRST(A) is the set of terminals which can appear as the first ele
我有一种用 CFG 表示的相当简单的语言。 S → A z A → A y A | A x A | A w | v 因为有左递归,递归下降解析器不会削减它。但是,我还需要找到所有可能的解释
Hibernate 的常用配置文件主要分为 2 种:核心配置文件(hibernate.cfg.xml)和映射文件(Xxx.hbm.xml),它们主要用于配置数据库连接、事务管理、Hibernate 本
出于测试目的,我需要 cfg 始终为真/假。对于 true 我使用 #[ cfg( target_pointer_width = "64") ] ... 但显然不够通用。表达 cfg 以获得必要值(v
我有以下常量: const IS_WSL: bool = is_wsl!(); 我希望能够将它与 cfg 属性一起使用来执行条件编译。像这样的东西: #[cfg(const = "IS_WSL")]
我知道给定一个特定的上下文无关语法,要检查它是否有歧义,需要检查是否存在任何可以以不止一种方式派生的字符串。这是不可判定的。 但是,我有一个更简单的问题。给定一个特定的上下文无关文法和一个特定的字符串
以下文法有左递归: T -> Tx | TYx | YX | x X -> xx Y -> Yy | Yx | y 你如何去除左递归。我阅读了维基百科的解释,但我对 CFG 还很陌生,所以它没有多大意
我想将 $cfg['RowActionLinksWithoutUnique'] 设置为 TRUE 以便我可以在 phpMyAdmin 中编辑数据而无需任何主键,但在检查 config.inc.php
考虑以下上下文无关文法的扩展,它允许规则在左侧有一个(或多个)终结符在非终结符的右侧。即形式规则: A b -> ... 右手边可以是任何东西,就像在上下文无关文法中一样。特别是不是 要求,右侧将在末
我是一名优秀的程序员,十分优秀!