我正在研究一种源到源编译器,旨在翻译不同编程语言之间的程序.现在,我正试图找到一种方法来跟踪不同编程语言中的等效函数,这样我就可以找出一种语言中的哪个函数等同于另一种语言中的相同函数.
给定一个像这样的数组,是否有可能编写一个函数,它将以另一种语言返回相应的函数(例如,使用查询,例如print(getCorrespondingValue("Python", [["Java", "System.out.println"]])),它将返回Python中与System.out.printlnJava 相对应的函数)?
correspondingFunctionDatabase = [
[
["Java", "System.out.println"], ["JavaScript", "console.log"], ["Python", "print"],
],
[
["Java", "s1.replaceAll(str1, str2);"], ["JavaScript", "str.replace(str1, str2)"], ["Python", "str.replace(str1, str2)"], ["Haxe", "replace(str, str1, str2)"]
],
[
["JavaScript", "str.split(separator)"], ["Java", "str.split(separator)"], ["Python", "re.split(separator, string)"]
],
[
["JavaScript", "eval(statement)"], ["Python", "eval(statement)"]
]
]
Run Code Online (Sandbox Code Playgroud)
Jon*_*nts 10
首先构建一个查找,然后访问:
from itertools import permutations
from collections import defaultdict
dd = defaultdict(dict)
for row in correspondingFunctionDatabase:
for fst, snd in permutations(row, 2):
dd[tuple(fst)][snd[0]] = snd[1]
print dd['Java', 'System.out.println']['Python']
# print
print dd['JavaScript', 'eval(statement)']['Python']
# eval(statement)
print dd['JavaScript', 'eval(statement)'].get('FakeLanguage', 'No Matching Function')
# No Matching Function
Run Code Online (Sandbox Code Playgroud)
作为一个注释,这也意味着您可以获得语句可以翻译成的语言,例如:
print list(dd["Java", "s1.replaceAll(str1, str2);"])
# ['Python', 'Haxe', 'JavaScript']
Run Code Online (Sandbox Code Playgroud)
根据评论中的要求,这可能是我通常会如何实现这一点.实际上我会使用一个Mongo数据库,但不能简洁.
DB = [
{"Java": "System.out.println", "JavaScript": "console.log", "Python", "print"},
{"Java": "s1.replaceAll(str1, str2);", "JavaScript": "str.replace(str1, str2)", "Python": "str.replace(str1, str2)", "Haxe": "replace(str, str1, str2)"},
{"JavaScript": "str.split(separator)", "Java": "str.split(separator)", "Python": "re.split(separator, string)"}
{"JavaScript": "eval(statement)", "Python": "eval(statement)"}]
def get_corresponding_value(language, entry):
try:
index = [value for key,value in DB if key == entry[0]].index(entry[1])
return DB[index].get(language, "No equivalent found")
except ValueError:
print "Could not find function: %s " % entry[1]
raise
Run Code Online (Sandbox Code Playgroud)
或者对于恋物癖的单行:
get_equiv = lambda language,entry: DB[[value for key,value in DB if key==entry[0]].index(entry[1])][language]
Run Code Online (Sandbox Code Playgroud)
我知道尝试除了有点过分,但未处理的错误是我的一个宠儿.