|
@@ -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']) |