| @@ -0,0 +1,134 @@ | |||||
| #!/usr/bin/env python3 | |||||
| # -*- coding: utf-8 -*- | |||||
| """ | |||||
| Created on Fri Mar 20 11:09:04 2020 | |||||
| @author: ljia | |||||
| """ | |||||
| import re | |||||
| def convert_function(cpp_code): | |||||
| # f_cpp = open('cpp_code.cpp', 'r') | |||||
| # # f_cpp = open('cpp_ext/src/median_graph_estimator.ipp', 'r') | |||||
| # cpp_code = f_cpp.read() | |||||
| python_code = cpp_code.replace('else if (', 'elif ') | |||||
| python_code = python_code.replace('if (', 'if ') | |||||
| python_code = python_code.replace('else {', 'else:') | |||||
| python_code = python_code.replace(') {', ':') | |||||
| python_code = python_code.replace(';\n', '\n') | |||||
| python_code = re.sub('\n(.*)}\n', '\n\n', python_code) | |||||
| # python_code = python_code.replace('}\n', '') | |||||
| python_code = python_code.replace('throw', 'raise') | |||||
| python_code = python_code.replace('error', 'Exception') | |||||
| python_code = python_code.replace('"', '\'') | |||||
| python_code = python_code.replace('\\\'', '"') | |||||
| python_code = python_code.replace('try {', 'try:') | |||||
| python_code = python_code.replace('true', 'True') | |||||
| python_code = python_code.replace('false', 'False') | |||||
| python_code = python_code.replace('catch (...', 'except') | |||||
| # python_code = re.sub('std::string\(\'(.*)\'\)', '$1', python_code) | |||||
| return python_code | |||||
| # # python_code = python_code.replace('}\n', '') | |||||
| # python_code = python_code.replace('option.first', 'opt_name') | |||||
| # python_code = python_code.replace('option.second', 'opt_val') | |||||
| # python_code = python_code.replace('ged::Error', 'Exception') | |||||
| # python_code = python_code.replace('std::string(\'Invalid argument "\')', '\'Invalid argument "\'') | |||||
| # f_cpp.close() | |||||
| # f_python = open('python_code.py', 'w') | |||||
| # f_python.write(python_code) | |||||
| # f_python.close() | |||||
| def convert_function_comment(cpp_fun_cmt, param_types): | |||||
| cpp_fun_cmt = cpp_fun_cmt.replace('\t', '') | |||||
| cpp_fun_cmt = cpp_fun_cmt.replace('\n * ', ' ') | |||||
| # split the input comment according to key words. | |||||
| param_split = None | |||||
| note = None | |||||
| cmt_split = cpp_fun_cmt.split('@brief')[1] | |||||
| brief = cmt_split | |||||
| if '@param' in cmt_split: | |||||
| cmt_split = cmt_split.split('@param') | |||||
| brief = cmt_split[0] | |||||
| param_split = cmt_split[1:] | |||||
| if '@note' in cmt_split[-1]: | |||||
| note_split = cmt_split[-1].split('@note') | |||||
| if param_split is not None: | |||||
| param_split.pop() | |||||
| param_split.append(note_split[0]) | |||||
| else: | |||||
| brief = note_split[0] | |||||
| note = note_split[1] | |||||
| # get parameters. | |||||
| if param_split is not None: | |||||
| for idx, param in enumerate(param_split): | |||||
| _, param_name, param_desc = param.split(' ', 2) | |||||
| param_name = function_comment_strip(param_name, ' *\n\t/') | |||||
| param_desc = function_comment_strip(param_desc, ' *\n\t/') | |||||
| param_split[idx] = (param_name, param_desc) | |||||
| # strip comments. | |||||
| brief = function_comment_strip(brief, ' *\n\t/') | |||||
| if note is not None: | |||||
| note = function_comment_strip(note, ' *\n\t/') | |||||
| # construct the Python function comment. | |||||
| python_fun_cmt = '"""' | |||||
| python_fun_cmt += brief + '\n' | |||||
| if param_split is not None and len(param_split) > 0: | |||||
| python_fun_cmt += '\nParameters\n----------' | |||||
| for idx, param in enumerate(param_split): | |||||
| python_fun_cmt += '\n' + param[0] + ' : ' + param_types[idx] | |||||
| python_fun_cmt += '\n\t' + param[1] + '\n' | |||||
| if note is not None: | |||||
| python_fun_cmt += '\nNote\n----\n' + note + '\n' | |||||
| python_fun_cmt += '"""' | |||||
| return python_fun_cmt | |||||
| def function_comment_strip(comment, bad_chars): | |||||
| head_removed, tail_removed = False, False | |||||
| while not head_removed or not tail_removed: | |||||
| if comment[0] in bad_chars: | |||||
| comment = comment[1:] | |||||
| head_removed = False | |||||
| else: | |||||
| head_removed = True | |||||
| if comment[-1] in bad_chars: | |||||
| comment = comment[:-1] | |||||
| tail_removed = False | |||||
| else: | |||||
| tail_removed = True | |||||
| return comment | |||||
| if __name__ == '__main__': | |||||
| # python_code = convert_function(""" | |||||
| # if (print_to_stdout_ == 2) { | |||||
| # std::cout << "\n===========================================================\n"; | |||||
| # std::cout << "Block gradient descent for initial median " << median_pos + 1 << " of " << medians.size() << ".\n"; | |||||
| # std::cout << "-----------------------------------------------------------\n"; | |||||
| # } | |||||
| # """) | |||||
| python_fun_cmt = convert_function_comment(""" | |||||
| /*! | |||||
| * @brief Returns the sum of distances. | |||||
| * @param[in] state The state of the estimator. | |||||
| * @return The sum of distances of the median when the estimator was in the state @p state during the last call to run(). | |||||
| */ | |||||
| """, ['string', 'string']) | |||||