gpt4 book ai didi

java - 解析 Beanshell 代码

转载 作者:行者123 更新时间:2023-12-02 02:28:25 26 4
gpt4 key购买 nike

我正在尝试为 beanshell 中编写的代码编写一个基本的静态代码分析工具,该工具将执行一些基本检查,例如未使用的变量、方法以及可能永远不会评估为 true 的条件。

我尝试使用 beanshell 源代码发行版附带的解析器,如下例所示:

import java.io.FileInputStream;
import java.io.IOException;

import bsh.ParseException;
import bsh.Parser;
import bsh.SimpleNode;

public class FindUnusedVariablesTask {

String sourseFilePath;

public FindUnusedVariablesTask(String sourseFilePath) {
this.sourseFilePath = sourseFilePath;
}


public String perform() throws ParseException, IOException {
FileInputStream sourceStream = new FileInputStream(sourseFilePath);
Parser p = new Parser(sourceStream);

while (!p.Line()) {
SimpleNode node = p.popNode();
System.out.println(node.getText());
for (int i=0; i<node.jjtGetNumChildren(); i++)
System.out.println(node.getChild(i).getText());
}
sourceStream.close();
return "";
}
}

对于以下 beanshell 代码:

f1 () {
return 1;
}

String f2(String x) {
return x + f1() + " OK";
}

输出如下:

f1 ( ) { 
( )
{

String f2 ( String x ) {
String
( String x )
{

基本上我只得到解析的方法声明。我找不到访问其中解析语句的方法。怎么才能做到这一点?

最佳答案

BeanShell 解析器生成 AST。一般来说,AST 的结构相当深入。您上面给出的代码仅深入 AST 1 层。

尝试递归遍历(我没有开发工具包,所以将其视为伪代码):

import bsh.Node; //you need this as well

public String perform() throws ParseException, IOException {
FileInputStream sourceStream = new FileInputStream(sourseFilePath);
Parser p = new Parser(sourceStream);

while (!p.Line()) {
recursive_print(p.popNode(), "");
}

sourceStream.close();
return "";
}

public void recursive_print(Node node, String prefix)
{
System.out.println(prefix + node.getText());
for (int i=0; i<node.jjtGetNumChildren(); i++)
recursive_print(node.getChild(i), prefix+" ");
}

关于java - 解析 Beanshell 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47493699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com