解析 Beanshell 代码
Parsing Beanshell code
我正在尝试为用 beanshell 编写的代码编写一个基本的静态代码分析工具,该工具将执行一些基本检查,例如未使用的变量、方法和可能永远不会计算为真的条件。
我已经尝试使用 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 一层。
尝试递归遍历(我没有devkit,所以将其视为伪代码):
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+" ");
}
我正在尝试为用 beanshell 编写的代码编写一个基本的静态代码分析工具,该工具将执行一些基本检查,例如未使用的变量、方法和可能永远不会计算为真的条件。
我已经尝试使用 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 一层。
尝试递归遍历(我没有devkit,所以将其视为伪代码):
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+" ");
}