-7

私は、異なるプログラミング言語間でプログラムを変換することを目的としたソースからソースへのコンパイラに取り組んでいます。現在、さまざまなプログラミング言語で同等の関数を追跡する方法を見つけようとしています。これにより、ある言語のどの関数が別の言語の同じ関数と同等であるかを見つけることができます。

このような配列が与えられた場合、別の言語で対応する関数を返す関数を作成することは可能ですか (たとえば、Javaprint(getCorrespondingValue("Python", [["Java", "System.out.println"]]))に対応する Python の関数を返すようなクエリを使用)?System.out.println

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)"] 
    ]
]
4

5 に答える 5

5

コメントで要求されているように、これはおそらく私が一般的にこれを実装する方法です。実際には、Mongo Database を使用しますが、簡潔にするために省略します。

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

またはフェティシストのためのワンライナー:

get_equiv = lambda language,entry: DB[[value for key,value in DB if key==entry[0]].index(entry[1])][language]

try except が少し過剰であることは承知していますが、処理されないエラーは私のペットの不満です。

于 2013-07-15T23:26:31.840 に答える
0

これにはもっと簡単な解決策があると思います:

# Build a list of dicts. Each dict maps language names
# to function names.
cfDicts = [dict(x) for x in correspondingFunctionDatabase]

def getCorrespondingValue(lang, construct):
    # Select all dicts that have an entry for lang and for
    # the given construct. A construct is a tuple of the
    # form (language, function).
    ds = [d for d in cfDicts if lang in d and
                                construct[0] in d and
                                d[construct[0]] == construct[1]]
    if len(ds) == 0:
        # There is no equivalent for `lang` to `construct`.
        return None
    else:
        # There should be only one match.
        assert len(ds) == 1, 'Multiple entries for' + str(construct)
        # Return the first match.
        return ds[0][lang]

2 番目の引数を 1 つの構成のみを含むように変更したことに注意してください。複数の構成を受け入れるように変更するのは簡単です (そして無意味です)。

例:

In [117]: getCorrespondingValue("Python", ["Java", "System.out.println"])
print
于 2013-07-15T23:26:56.130 に答える
0

ここでは、2 つの dict を使用しています。

equivalenceclasses = {n: dict(map(tuple,klass)) for n,klass in enumerate(correspondingFunctionDatabase)}
bypair = {tuple(pair):n for n,klass in enumerate(correspondingFunctionDatabase) for pair in klass}

#note pep8 style name
def get_corresponding_function(targetlang, pair):
    # you could catch exceptions here
    return equivalenceclasses.get(bypair.get(tuple(pair))).get(targetlang)

print get_corresponding_function("Python", ["Java", "System.out.println"])

「データベース」の各行はクラスを表します。そのようなクラスはそれぞれ整数で識別でき、その整数を使用して 2 つの dict を結合できます。もちろん、sqlite(または他のSQL)またはフリーフォームデータベースを使用することもできます。

ここで実際の動作を確認してください: http://ideone.com/oxrdEV

于 2013-07-16T00:10:00.357 に答える
-4

はい、これは間違いなく可能です。Python で完全に機能するソリューションを作成しました。

まず、さまざまなプログラミング言語で対応する関数の配列を作成しました。

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)"] 
    ]
]

次に、getCorrespondingValue別の言語の関数に対応するある言語の関数を返す という関数を作成しました。

def containsAll(containingArray, containsAllOfThese):
    i = 0
    while(i < len(containsAllOfThese)):
        if((containsAllOfThese[i] in containingArray) == False):
            return False
        i += 1
    return True

def getCorrespondingValue(valueToRetrieve, valueCorrespondsTo, mainArray=correspondingFunctionDatabase, printMessages=False):
    i = 0
    correspondingValues = []
    while(i < len(mainArray)):
        if(containsAll(containsAllOfThese=valueCorrespondsTo, containingArray = mainArray[i])):
            if(printMessages == True):
                print("The elements of the array:\n", valueCorrespondsTo)
                print("Are contained in the array:\n", str(mainArray[i])+"\n")
            j = 0
            while(j < len(mainArray[i])):
                if(mainArray[i][j][0] == valueToRetrieve):

                    print(mainArray[i][j])

                    correspondingValues += [mainArray[i][j][1]]
                j += 1
        i += 1
    print("The retrieved values for", valueToRetrieve, "from", valueCorrespondsTo, "are", correspondingValues)
    return correspondingValues

この関数の使用例をいくつか示します。

'''
This function call returns the Python function that corresponds to System.out.println in Java.
'''
print(getCorrespondingValue("Python", [["Java", "System.out.println"]]))

'''
This function call returns the Java function that corresponds to console.log in JavaScript.
'''
print(getCorrespondingValue("Java", [["JavaScript", "console.log"]]))
于 2013-07-15T22:33:47.380 に答える