求教。如何将所有语句处理成 一行一条语句

圆滚肉 2016-01-13 04:51:32
有个需求是对指定的代码做记录,然而只能记录语句的起始行号,导致如果这条语句跨行,那么只能记录下第一行的行号,接下来的行号并不会被记录下来。

需要做得是:


return this.getClass().getName().
substring(0, this.getClass().getName().lastIndexOf('$'));


处理成
return this.getClass().getName().substring(0, this.getClass().getName().lastIndexOf('$'));



多谢~。


...全文
307 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
圆滚肉 2016-01-16
  • 打赏
  • 举报
回复
引用 10 楼 attilax 的回复:
正规做法是解析java AST语法树。。当然简单点的做法用正则得了。。还可以使用代码每行判断就是了, ,但是实现简单。。根据java语法规则
我试验了AST语法树,由于嵌套,无法正确划分行号。 正则分号,会导致FOR语句划分三行,还有一些包含分号的String也会被划分 能否详细解释下根据java语法规则判断每行的实现思路
attilax 2016-01-15
  • 打赏
  • 举报
回复
正规做法是解析java AST语法树。。当然简单点的做法用正则得了。。还可以使用代码每行判断就是了, ,但是实现简单。。根据java语法规则
圆滚肉 2016-01-14
  • 打赏
  • 举报
回复
引用 7 楼 windowsoahil 的回复:
还有退而求其次的办法,就是对代码文本正则匹配,把两个分号;中间都视为一行,去掉里边的换行符
for语句会被拆成三行的。。。
解开者 2016-01-14
  • 打赏
  • 举报
回复
还有退而求其次的办法,就是对代码文本正则匹配,把两个分号;中间都视为一行,去掉里边的换行符
圆滚肉 2016-01-13
  • 打赏
  • 举报
回复
引用 5 楼 windowsoahil 的回复:
[quote=引用 4 楼 prudens 的回复:] [quote=引用 3 楼 windowsoahil 的回复:] 这需求是要干啥?这种处理方式和java本身对代码行数的处理是不一致的。
public class Test {
	public static void main(String[] args) {
		throw
		new
		RuntimeException();
	}
}
猜一下异常堆栈出现在第几行? 实际上是new这行。 所以java显然认为这是3行代码
我做的是对代码的故障定位,不是商业软件,所以可能需求并不是太常见。
public static void main(String[] args) {
		int i 
		=3;
		int j =
		++i;
	}
比如分析代码,提取出影响 j 值的代码。 显而易见i影响j,因此需要提取int i=3这条语句,但是我只能提取到语句的起始行,即只能提取到行号2,并不能取到行号3,导致提取后只有 int i 这一部分。 因此想着,如果能对这个程序预处理,合并到同一行中,就不存在只能提取一条语句的一部分的状况了。 [/quote] 看上去像是用了语义分析算法,这样是比较好办的,在建语法树的时候给每个节点绑一个它的行数,还原现场的时候带着就行了[/quote] 赞~这个方法应该是可行的。只是现在项目已经接近尾声,这样改动太大。因此还是想从对待测程序本身入手,将代码行合并。
解开者 2016-01-13
  • 打赏
  • 举报
回复
引用 4 楼 prudens 的回复:
[quote=引用 3 楼 windowsoahil 的回复:] 这需求是要干啥?这种处理方式和java本身对代码行数的处理是不一致的。
public class Test {
	public static void main(String[] args) {
		throw
		new
		RuntimeException();
	}
}
猜一下异常堆栈出现在第几行? 实际上是new这行。 所以java显然认为这是3行代码
我做的是对代码的故障定位,不是商业软件,所以可能需求并不是太常见。
public static void main(String[] args) {
		int i 
		=3;
		int j =
		++i;
	}
比如分析代码,提取出影响 j 值的代码。 显而易见i影响j,因此需要提取int i=3这条语句,但是我只能提取到语句的起始行,即只能提取到行号2,并不能取到行号3,导致提取后只有 int i 这一部分。 因此想着,如果能对这个程序预处理,合并到同一行中,就不存在只能提取一条语句的一部分的状况了。 [/quote] 看上去像是用了语义分析算法,这样是比较好办的,在建语法树的时候给每个节点绑一个它的行数,还原现场的时候带着就行了
圆滚肉 2016-01-13
  • 打赏
  • 举报
回复
引用 3 楼 windowsoahil 的回复:
这需求是要干啥?这种处理方式和java本身对代码行数的处理是不一致的。
public class Test {
	public static void main(String[] args) {
		throw
		new
		RuntimeException();
	}
}
猜一下异常堆栈出现在第几行? 实际上是new这行。 所以java显然认为这是3行代码
我做的是对代码的故障定位,不是商业软件,所以可能需求并不是太常见。
public static void main(String[] args) {
		int i 
		=3;
		int j =
		++i;
	}
比如分析代码,提取出影响 j 值的代码。 显而易见i影响j,因此需要提取int i=3这条语句,但是我只能提取到语句的起始行,即只能提取到行号2,并不能取到行号3,导致提取后只有 int i 这一部分。 因此想着,如果能对这个程序预处理,合并到同一行中,就不存在只能提取一条语句的一部分的状况了。
解开者 2016-01-13
  • 打赏
  • 举报
回复
这需求是要干啥?这种处理方式和java本身对代码行数的处理是不一致的。
public class Test {
	public static void main(String[] args) {
		throw
		new
		RuntimeException();
	}
}
猜一下异常堆栈出现在第几行? 实际上是new这行。 所以java显然认为这是3行代码
圆滚肉 2016-01-13
  • 打赏
  • 举报
回复
引用 1 楼 angeljie8 的回复:
是否可以通过判断行末内容,识别是否是正常语句?是的话不处理,不是的话,将该行与其下一行进行合并,合并时,消除下一行的空格
感觉思路是对的。但是如何判断为正常语句是个问题。。。
重名率太高 2016-01-13
  • 打赏
  • 举报
回复
是否可以通过判断行末内容,识别是否是正常语句?是的话不处理,不是的话,将该行与其下一行进行合并,合并时,消除下一行的空格

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧