2011-08-27 2 views
12

У меня работает образовательный веб-сайт, который обучает программированию детям (12-15 лет).Перевод исходного кода на иностранный язык

Поскольку они не все говорят по-английски в источнике кода решений, мы используем имена переменных и функций во Франции. Однако мы планируем перевести контент на другие языки (немецкий, испанский, английский). Для этого я хотел бы как можно быстрее перевести исходный код. У нас в основном есть код C/C++.

Решение Я планирую использовать:

  1. вытяжных все переменные/функции имена из исходного кода, с их позиции в файле (где они объявлены, используется, называется ...)
  2. удалить все ключевые слова языка и функции библиотеки
  3. попросить переводчика предоставить переводы для остальных имен
  4. заменить имена в файле

Есть ли уже какой-то открытый код/​​проект с открытым исходным кодом, который может это сделать? (Для точек 1,2 и 4)

Если нет, то самая сложная точка в первом: использование синтаксического анализатора C/C++ для создания синтаксического дерева и последующего извлечения переменных с их позицией представляется путь. У вас есть другие идеи?

Благодарим за любые советы.

Edit: Как отмечено в комментарии, я также необходимо позаботиться о комментариях, но есть только несколько из них: полное решение уже объяснено в обычный текст, а затем мы показываем код -source с самообновленными именами переменных/функций. Исходный код редко бывает длиннее 30/40 строк, а хорошие имена должны быть понятны без комментариев, если вы уже знаете, что делает код.

Дополнительной информация: для людей, интересующихся веб-сайта является тренировочной площадкой для Международных олимпиад по информатике и C/C++ (по крайней мере, минимум, необходимый для конкурса программирования) не так трудно выучить в 12 лет ,

+0

Попробуйте ввести код непосредственно в перевод Google. Это очень хорошая работа только для перевода слов. То, что он делает «случайно», может быть рассмотрено, запустив код через что-то, что заменяет их известными заменителями. – Lalaland

+4

Некоторые бы поставили под вопрос решение использовать C/C++ для обучения детей тому возраста, но я написал C, когда мне было 15, и, насколько я могу судить, не получил никакого урона.(Написание Pascal в более раннем возрасте вредило мне больше, потому что у меня не было никакого руководства по произведению для многих ключевых слов. Мне потребовались годы, чтобы прекратить произносить «начало», как если бы это был израильский премьер-министр). –

+0

Некоторые имена переменных могут быть легко переведены автоматическими инструментами. Например (французский-> английский): «longueurMax» -> «maxLength». Также мы хотим (почти) совершенный перевод, чтобы имена переменных не могли быть автоматически переведены, но выбраны переводчиком-программистом. –

ответ

2

Вам не нужен парсер 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. 
    } 
} 

Я написал код в редакторе, так что могут быть незначительные ошибки. Скажи мне, если они есть, и я исправлю это.

Edit: Объяснение:

Что делает код просто для чтения ввода посимвольно, выводя все, не буквы символов читает (включая пробелы, символы табуляции и новой строки).Если он видит письмо, он начнет помещать все следующие буквы в одну строку (пока не достигнет другой небукты). Тогда, если строка была ключевым словом, она вывела бы ключевое слово. Если бы это было не так, перевести его и вывести его.

Выход будет иметь тот же формат, что и вход.

+0

void translateCode (istream & in, ostream &out); , удалить окончательный;. – Lalaland

+1

Список всех ключевых слов есть для cpp: http://en.cppreference.com/w/cpp/keywords и там для c: http://tigcc.ticalc.org/doc/keywords .html - но помимо них вы должны позаботиться о всех стандартных символах, таких как 'cin',' cout', 'printf' и т. д. (тонны) и имена файлов заголовков. Тем не менее это может быть хороший старт – Shlublu

+0

Спасибо, а также хорошее напоминание о c/C++ уже определили функции и объекты @shlubu. Это всего лишь вопрос сбора списка вещей, которые они написали в своих программах, которые должны быть исключены из перевода и помещены туда в программе. – Shahbaz

2

Вам нужно полное синтаксическое дерево для этого? Я думаю, что достаточно будет лексического анализа, чтобы найти идентификаторы, что намного проще. Затем исключайте ключевые слова и идентификаторы, которые также отображаются в заголовочных файлах, которые включены.

В принципе, возможно, что вы хотите, чтобы разные переменные с одним и тем же английским именем были переведены на разные слова на французском/немецком языке, но для образовательного использования риск возникновения этого явления, вероятно, достаточно мал, чтобы игнорировать вначале. Вы можете обойти эту проблему, написав исходные источники с некоторыми двусмысленными квази-венгерскими префиксами, а затем удалите их с тем же механизмом перевода для отображения англоязычным конечным пользователям.

Убедись, что переводчики понимают, что они переводят с полным контекстом, прежде чем выбрать перевод.

+0

Действительно, исходные коды являются небольшими (но их очень много), и переменные всегда хорошо названы, в частности: никогда не одно и то же имя, если различный смысл, не однобуквенные переменные ... И да, переводчик будет иметь полный контекст, этот инструмент перевода находится здесь, чтобы помочь ему. –

2

Я действительно думаю, что вы можете использовать лязг (libclang) для анализа ваших источников и делать то, что вы хотите (see here for more information), хорошая новость заключается в том, что у них есть питон привязок, которые сделают вашу жизнь проще, если вы хотите получить доступ служба перевода или что-то в этом роде.

0

Я не думаю, что замена идентификаторов в коде - хорошая идея.

Во-первых, вы не получите достойных переводов. Очень важный момент заключается в том, что перевод (особенно автоматический или довольно тупой перевод) теряет и искажает информацию. На самом деле у вас может быть что-то хуже, чем оригинал.

Во-вторых, если код предназначен для компиляции снова, компилятор может не скомпилировать код, содержащий неанглийские буквы в переведенных идентификаторах.

В-третьих, если вы заменяете идентификаторы чем-то другим, вам необходимо убедиться, что вы не заменяете 2 или более разных идентификатора одним и тем же словом. Это либо сделает код не компилируемым, либо разрушит его логику.

В-четвертых, вы должны убедиться, что не переводите зарезервированные слова и идентификаторы из стандартной библиотеки языка. Перевод этих данных сделает код не компилируемым и нечитаемым. Не может быть очень тривиальной задачей различать идентификаторы, которые программист определил, от тех, которые предоставляются языком и его стандартной библиотекой.

Что мне нужно делать вместо того, чтобы заменить идентификаторы с их переводами есть, обеспечить перевод в виде комментариев рядом с ними, например:

void eat/*comer*/(int* food/*comida*/) 
{ 
    if (*food/*comida*/ <= 0) 
    { 
    printf("nothing to eat!"/*no hay que comer!*/); 
    exit/*salir*/(-1); 
    } 
    (*food/*comida*/)--; 
} 

Таким образом, вы не потеряете никакой информации из-за неправильный перевод и Дон» t разорвать код.

Смежные вопросы