将源代码翻译成外语

我正在运行一个教育网站,为孩子们(12-15岁)教授节目。

由于他们并不都在解决方案的代码源中使用英语,所以我们使用法语变量和函数名称。 不过,我们计划将内容翻译成其他语言(德语,西班牙语,英语)。 为此,我想尽可能快地翻译源代码。 我们主要有C / C ++代码。

我打算使用的解决方案:

  • 从源代码中提取所有变量/函数名称,并将它们在文件中的位置(声明,使用,称为...的位置)
  • 删除所有语言关键字和库函数
  • 请翻译人员为其余姓名提供翻译
  • 替换文件中的名称
  • 是否已经有一些可以做到这一点的开源代码/项目? (对于点1,2和4)

    如果没有,那么第一个问题中最困难的一点是:使用C / C ++解析器来构建一个语法树,然后用它们的位置提取这些变量似乎是一种方法。 你有其他想法吗?

    感谢您的任何建议。

    编辑:正如评论中指出的那样,我还需要照顾评论,但其中只有少数评论:完整的解决方案已经用纯文本解释,然后我们用自解释变量显示代码源/函数名称。 源代码很少超过30/40行,如果您已经知道代码正在做什么,那么好的名称必须使其可以理解而无需评论。

    附加信息:对于感兴趣的人来说,这个网站是国际奥林匹克运动会的信息学和C / C ++培训平台(至少是编程比赛所需的最低限度)并不难学到12岁。


    你确定你需要一个完整的语法树吗? 我认为用词法分析来找到标识符就足够了,这很容易。 然后排除也包含在头文件中的关键字和标识符。

    原则上,您可能希望将具有相同英文名称的不同变量翻译为法语/德语中的不同词语,但对于教育用途而言,其风险可能小到可以忽略的程度。 您可以通过使用一些明确的准匈牙利语前缀编写原始来源来避开这个问题,然后使用相同的翻译机制将这些翻译机制删除,以便向英语终端用户展示。

    务必让翻译人员在选择翻译之前查看他们正在翻译的名称。


    我真的认为你可以使用clang (libclang)来解析你的源代码并做你想做的事情(这里有更多的信息),好消息是它们有python绑定,如果你想访问一个翻译,这会让你的生活更轻松服务或类似的东西。


    您并不需要C / C ++解析器,只需一个简单的词法分析器,即可逐个给出您的代码元素。 然后,你可以得到很多的{[213)等,你根本不理会,并写入结果文件。 你翻译只包含字母(关键字除外)的任何内容,然后将它们放在输出中。

    现在我想到了,它就像这样简单:

    bool is_letter(char c)
    {
        return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
    }
    bool is_keyword(string &s)
    {
        return s == "if" || s == "else" || s == "void" /* rest of them */;
    }
    void translateCode(istream &in, ostream &out)
    {
        while (!in.eof())
        {
            char c = in.get();
            if (is_letter(c))
            {
                string name = "";
                do
                {
                    name += c;
                    c = in.get();
                } while (is_letter(c) && !in.eof());
                if (is_keyword(name))
                    out << name;
                else
                    out << translate(name);
            }
            out << c;  // even if is_letter(c) was true, there is a new c from the
                       // while inside that was read (which was not letter), but
                       // not written, so would be written here.
        }
    }
    

    我在编辑器中编写了代码,因此可能会有小错误。 告诉我是否有任何问题,我会解决它。

    编辑:说明:

    代码所做的仅仅是逐字读取输入,输出它读取的任何非字母字符(包括空格,制表符和新行)。 如果它确实看到一封信,它将开始将所有以下字母放在一个字符串中(直到它到达另一个非字母)。 然后如果字符串是关键字,它会输出关键字本身。 如果不是,将会翻译并输出。

    输出将具有与输入完全相同的格式。

    链接地址: http://www.djcxy.com/p/73287.html

    上一篇: Translating source code into a foreign language

    下一篇: printing a binary tree in C (and other imperative languages)