- 论坛徽章:
- 0
|
本帖最后由 GhostFromHeaven 于 2013-05-24 22:46 编辑
回复 9# abcfy2
switch不同case里的save不会被重复计数,但会把switch各分支中最多的save数加到函数里面。
打印格式为:文件名:行号:内容
可以处理多个文件。- #-*- coding:utf-8 -*-
- import os
- import re
- import string
- pattern_func_def = re.compile('''(?<!\S)def\s+.*?\s+\{\s*''')
- pattern_save = re.compile('''\.save\s*\(.*?\)''')
- 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_left_brace = re.compile('''.*?\{.*?''')
- pattern_right_brace = re.compile('''.*?\}.*?''')
- 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 "%10s:%04d:%s" % (os.path.basename(self.current_file_name),
- self.current_line_index,
- self.current_line)
-
- # 处理{}
- def _handle_brace(self, line):
- # 假设每行最多一个{
- _brace_count = 0
- if pattern_left_brace.search(line):
- _brace_count -= 1
- # 假设每行最多一个}
- if pattern_right_brace.search(line):
- _brace_count += 1
- return _brace_count
-
- # 处理xx.save(yy)
- def _handle_save(self, line, save_count):
- _save_count_in_1_function = save_count
- # 假设每行最多一个.save()
- if pattern_save.search(line):
- _save_count_in_1_function += 1
- # 如果有多个save,则打印出来
- if _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:
- #line = self.get_line()
- if not line:
- break
- # 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:
- if not line:
- break
- # 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)
-
- # xx.save(yy)
- #_save_count_in_1_function += self._handle_save(line, _save_count_in_1_function)
- # 定义结束
- 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:
- if not line:
- break
-
- # 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 not line:
- break
- if pattern_func_def.search(line):
- self.parse_func_def()
-
- if __name__ == "__main__":
- file_list = [r'C:\Users\fgl\Desktop\test\to_parse_2.groovy']#, 'to_parse_1.groovy']
- gp = GroovyParser()
- gp.parse(file_list)
-
-
复制代码
to_parse_2.zip
(534 Bytes, 下载次数: 1)
|
|