- 论坛徽章:
- 0
|
回复 20# GhostFromHeaven
我按照你说的把if not line:语句全删了,改后的代码如下:- #!/usr/bin/python
- #-*- coding:utf-8 -*-
- import os
- import re
- import string
- import sys
- pattern_func_def = re.compile('''(?<!\S)def\s+.*?\{\s*''')
- pattern_save = re.compile('''\.save\s*\(.*?\)|\.delete\s*\(.*?\)''') #同时筛选save方法和delete方法
- pattern_left_brace = re.compile('''.*?\{.*?''')
- pattern_right_brace = re.compile('''.*?\}.*?''')
- pattern_switch = re.compile('''(?<!\S)switch\s*\(.*?\)\s*{''')
- pattern_case = re.compile('''(?<!\S)(case\s+\S+)|(default)\s*:''')
- pattern_break = re.compile('''(?<!\S)break(?!\S)''')
- pattern_if = re.compile('''(?<!\S)if\s*\(.*\.save\(\s*\).*\)\s*''')
- pattern_save_without_arg = re.compile('''\.save\s*\(\s*\)''')
- class GroovyParser(object):
- def __init__(self):
- self.current_file_name = ""
- self.current_file_handler = None
- self.current_line = ""
- self.current_line_index = 0
-
- def _get_line(self):
- for self.current_line in open(self.current_file_name, "r"):
- self.current_line_index += 1
- self.current_line = self.current_line.strip('\n')
- yield "%s" % self.current_line
-
- def print_line(self):
- print "%s:%d:%s" % (self.current_file_name,
- self.current_line_index,
- self.current_line)
-
- # 处理{}
- def _handle_brace(self, line):
- # 假设每行可以有多个{
- _brace_count = 0
- groups = pattern_left_brace.findall(line)
- if groups:
- _brace_count -= len(groups)
- # 假设每行可以有多个}
- groups = pattern_right_brace.findall(line)
- if groups:
- _brace_count += len(groups)
- return _brace_count
-
- # 处理xx.save(yy)
- def _handle_save(self, line, save_count):
- _save_count_in_1_function = save_count
- # 假设每行可以有多个.save()
- new_save_count = 0
- groups = pattern_save.findall(line)
- if groups:
- # 检测是否为if()
- new_save_count = len(groups)
- if pattern_if.search(line):
- # 搜索.save()
- groups = pattern_save_without_arg.findall(line)
- new_save_count -= len(groups)
-
- _save_count_in_1_function += new_save_count
- # 如果有多个save,则打印出来
- if new_save_count > 0 and _save_count_in_1_function > 1:
- self.print_line()
- return 1
- return 0
-
- def parse_func_def(self):
- _brace_count = -1
- _save_count_in_1_function = 0
- for line in self.line_reader:
- # function
- if pattern_func_def.search(line):
- self.parse_func_def()
-
- # switch
- if pattern_switch.search(line):
- _save_count_in_1_function = self.parse_switch_def(_save_count_in_1_function)
-
- # {}
- _brace_count += self._handle_brace(line)
-
- # xx.save(yy)
- _save_count_in_1_function += self._handle_save(line, _save_count_in_1_function)
-
- # 定义结束
- if _brace_count >= 0:
- return
- def parse_switch_def(self, save_count):
- _brace_count = -1
- _save_count_in_1_function = save_count
- _max_save_count = save_count
- _all_save_count = save_count
- for line in self.line_reader:
- # switch
- if pattern_switch.search(line):
- _all_save_count = self.parse_switch_def(_save_count_in_1_function)
-
- if pattern_case.search(line):
- _get_brace_count, _all_save_count = self.parse_case_def(_save_count_in_1_function)
- _brace_count += _get_brace_count
-
- if _max_save_count < _all_save_count:
- _max_save_count = _all_save_count
-
- # {}
- _brace_count += self._handle_brace(line)
-
- # 定义结束
- if _brace_count >= 0:
- break
- return _max_save_count
-
- def parse_case_def(self, save_count):
- _brace_count = 0
- _save_count_in_1_function = save_count
- for line in self.line_reader:
-
- # xx.save(yy)
- _save_count_in_1_function += self._handle_save(line, _save_count_in_1_function)
-
- # break
- if pattern_break.search(line):
- break
- # {}
- _brace_count = self._handle_brace(line)
- if _brace_count == -1:
- break
- return (_brace_count, _save_count_in_1_function)
- def parse(self, file_list):
- for self.current_file_name in file_list:
- self.line_reader = self._get_line()
- self.current_line_index = 0
- for line in self.line_reader:
- if pattern_func_def.search(line):
- self.parse_func_def()
- def help():
- print """用法:
- sys.argv[0] dir1 [dir2] [dir3] ..."""
-
- if __name__ == "__main__":
- if len(sys.argv) <= 1:
- help()
- exit(1)
- else:
- for dir in sys.argv[1:]:
- file_list = os.popen('find '+ dir + ' -type f -name *Controller.groovy').read().rstrip('\n').split('\n')
- if file_list != ['']:
- gp = GroovyParser()
- gp.parse(file_list)
复制代码 测试样本:- def fuction4 = {
- dosomething
- something.save(abc1).save(dxy)
- something.save(def2)
- if (xx.save() && yy.save())
- {
- xxa.save()
- }
-
- if(xx.save() && yy.save())
- {
- xxa.save()
- }
-
- if(xx.save(xx) && yy.save())
- {
- xxa.save()
- }
-
- if(xx.save(xx) && yy.save(yy))
- {
- xxa.save()
- }
- }
- def giveUpBentAxle(){
- withPersonalProject{projectInstance->
- try {
- def bentAxleList=projectInstance.bentAxle
- projectInstance.bentAxle=null
- bentAxleList.each {BentAxle bentAxle->
- bentAxle.delete()
- }
- projectInstance.bentAxleStep=0
- !projectInstance.save(flush: true)?renderMsg('放弃曲轴校验,请联系管理员!'):renderSuccess()
- }catch (VulcanCustomeException e) {
- renderMsg('放弃设计失败,请联系管理员!')
- }
- }
- }
- def giveUpConnectingRod(){
- withPersonalProject{projectInstance->
- try {
- ConnectingRod rod=projectInstance.connectingRod
- if (rod) {
- projectInstance.connectingRod=null
- rod.delete()
- }
- projectInstance.rodStep=0
- !projectInstance.save(flush: true)?renderMsg('放弃连杆校验,请联系管理员!'):renderSuccess()
- }catch (VulcanCustomeException e) {
- renderMsg('放弃连杆失败,请联系管理员!')
- }
- }
- }
复制代码 筛选结果如下:- ./to_parse_2Controller.groovy:0003: something.save(abc1).save(dxy)
- ./to_parse_2Controller.groovy:0004: something.save(def2)
- ./to_parse_2Controller.groovy:0007: xxa.save()
- ./to_parse_2Controller.groovy:0012: xxa.save()
- ./to_parse_2Controller.groovy:0015: if(xx.save(xx) && yy.save())
- ./to_parse_2Controller.groovy:0017: xxa.save()
- ./to_parse_2Controller.groovy:0020: if(xx.save(xx) && yy.save(yy))
- ./to_parse_2Controller.groovy:0022: xxa.save()
- ./to_parse_2Controller.groovy:0035: !projectInstance.save(flush: true)?renderMsg('放弃曲轴校验,请联系管理员!'):renderSuccess()
- ./to_parse_2Controller.groovy:0051: !projectInstance.save(flush: true)?renderMsg('放弃连杆校验,请联系管理员!'):renderSuccess()
复制代码 最后两行的确是给筛选出来了 |
|