Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки Cтатьи на компьютерные темы Компьютерный юмор Новости и прочее

Утилита транслитерации русского C/C++ в стандартный

Эта утилита командной строки даст возможность программировать на C/C++ на русском языке, не будучи привязанной к какому-либо компилятору. Её идея проста: берётся исходный текст программы, и если в ней встречаются идентификаторы на кириллице, то они подвергаются транслитерации: «а» -> «a», «б» -> «b», «в» -> «v», «г» -> «g», «д» -> «d», «е» -> «e», «ё» -> «yo», «ж» -> «zh» и т.д. Символ «№» так же считается буквой и при транслитерации наменяется на «Nom». В результате в сформированном утилитой файле программа находится в виде, пригодном для дальнейшей компиляции.

        Запуск утилиты:

cpp-rus.exe from~to.cpp from1~to1.cpp from2~to2.cpp
  • Первая часть аргумента (до символов «~» или «!») — имя файла с русским текстом C/C++, в приведённом примерах — это файлы «from», «from1», «from2».
  • Вторая часть аргумента — имя файла, куда следует поместить текст C/C++ после транслитерации, в приведённых примерах — это файлы «to.cpp», «to1.cpp», «to2.cpp».
  • Если разделителем имён файлов является символ «~», то при транслитерации одиночные пробелы раменяются на «_». Если «!», то считается, что одиночные пробелы в идентификаторах недопустимы и их замена не делается.
  • Число аргументов (пар имён файлов) — произвольное.
        Для удобства между строками входного и выходного файла существует полное соответствие. Поэтому если компилятор нашёл ошибку в строке N файла «to.cpp», то нужно смотреть ту же самую строку N, но файла «from».

        Некоторые программисты находят, что пробелы в идентификаторах улучшают читаемость программ. Согласитесь, что идентификатор «длина входной строки» выглядит предпочтительнее, чем «ДлинаВходнойСтроки» или «длина_входной_строки» (в выходном файле будет записано «dlina_vhodnoj_stroki»). Одиночные пробелы внутри идентификаторов делают их более естественными. Но в таком случае мы теряем право использовать одиночный пробел в качестве разделителя лексем. То есть «int i» при транслитерации будет заменено на «int_i», что является ошибкой. Необходимо разделять «int» и «i» двумя пробелами или символом табуляции.
        Если вы находите такое неудобным, надо просто при запуске утилиты сделать разделителем пар имён файлов символ «!».

Русификация
        Итак, отличия «русского C/C++» этой утилиты от стандартного C/C++:
  • Возможность употребления русских идентификаторов.
  • Возможность употребления одиночных пробелов внутри идентификаторов.
  • Возможность употребления любых идентификаторов, для этого они ограничиваются с обоих сторон символами «`» (обратный апостроф, на одной клавише с «~», «ё» и «Ё»); индентификатор `если X != Y` после транслитерации будет выглядеть так: esli_20X_20_21_3D_20Y.
  • Возможность записи констант в двоичном виде; константы вида 2"1о1о_о11о 111о_оо1о" или 2'1о1о_о11о 111о_оо1о' заменяются в выходном файле на эквивалентное «0xA6E2». Нули внутри константы можно записывать буквами «O» или «o» (как русскими, так и латинскими), а единицы — буквой «l». Допускается при этом пробелы и «_» (в любом количестве и в любом порядке) внутри кавычек для более наглядной записи.
  • Стантарты C и C++ требуют, чтобы символ # команд препроцессора был первым в строке; теперь перед ним можно употреблять пробелы и табуляции, что бывает удобным при форматировании текста:
       #вставка  
       #вставка 
       #если нет	INCLUDE_DEBUG
         #вставка	"debug.c"
       #к если
    
    В выходном тексте на стандартных C и C++ команды препроцессора будут перемещены в начало строки.
        Утилита производит автоопределение кодировок: cp886, cp1251 или utf-8. Каких символов больше в тексте программы, та кодировка и используется. В файле «replace.csv» находится таблица замен: в первом поле — идентификатор на русском языке, во втором — идентификатор, который должен заменить идентификатор из первого поля в результирующем файле. Например, строка «если;if» означает, что слово «если» входного текста заменит «if» в выходном тексте.

        Эта четвёртая версия утилиты с 1999 года, каждая версия писалась с нуля. Последняя версия написана на чистом C и откомпилирована Tiny C Compiler. При этом программа написана на «русском Си», а Tiny C Compiler, как из известно, кириллицу не поддерживает.

Возможные проблемы при транслитерации

        Поскольку транслитерация не гарантирует однозначного соответствия входного и выходного тестов, то возможны коллизии. Так, слова «пасха» и «паша» будет представлены в выходном тексте одинаково: «pasha». Но за многие годы использования этой программы подобные казусы места не имели.

        Так же следует учитывать, что эта утилита не запрещает употребление латиницы. Смещанное же использование кириллицы и латиницы может приводить к проблемам:
int a;     // a — латинская
int а;     // а — русская, будет произведена транлитетерация в латинскую «a», 
           // компилятор выдаст сообщение о повторном объявлении переменной

Ограничения при использовании

        Представленная утилита является консольным приложением Windows. Задача «втиснуть» её между тестовым редактором IDE и компилятором не является простой и автором она не решена. Поэтому типичным является такой вариант использования: редактирование — запуск bat-ника (см. пример ниже) — запуск откомпилированного exe-файла. Но любителей командной строки такой вариант вполне устроит.

Пример использования

"c:\program files\far2\far.exe" /e %1
cpp-rus.exe %1~%1.c
tcc -o %1.exe %1.c
pause
        Если записать это в файл «edcompil.bat», то запустив «edcompil.bat  myprog», мы
  • редактируем текст программы на кириллице «myprog» текстовым редактором «far» (первая строка),
  • производим транслитерацию теста «myprog» в файл «myprog.c» (вторая строка),
  • компилируем (третья строка) «myprog.c» в «myprog.exe» компилятором «tcc» (или другим; соответственно строка должна быть другой),
  • останавливаемся (четвёртая строка), чтобы увидеть ошибки при компиляции, если таковые есть.
Далее запускаем на выполнение «myprog.exe».

Как использовать русские ключевые слова при программировании?

Версии утилиты, разработанные до сентября 2014 г., для русификации ключевых, служебных и прочих слов использовали переопределение с помощью команд препроцессора, например:
#define		выйти		break
#define		класс		class
#define		конст		const
#define		заново		continue
#define		цикл		do
#define		иначе		else
#define		для		for
#define		если		if
#define		цел		int
#define		длинный		long
#define		вернуть		return
#define		короткий	short
#define		пустой		void
#define		пока		while
        Но командами препроцессора нельзя переопределить сами команды препроцессора. Без этого русификация неполна. Теперь замены слов вносятся в файл «replace.csv», который имеет следующий вид
вернуть;return
вставка;include
выбор;switch
выйти;break
двойн;double
двойной;double
для;for
если;if
заново;continue
иначе;else
        В списке русских ключевых слов ориентировался на Евгения Александровича Зуева, но не на 100%, кое-что заменил на свой вкус. Если что-то не нравится Вам, то Вы тоже можете менять. Эту таблицу можно пополнять, например, для того, чтобы заменить имена библиотечных функций типа «printf» или «fopen» на русскоязычные эквиваленты. При правке следует учитывать:
  • Первое поле таблицы — заменяемые слова, второе — заменяющие.
  • В первом поле символы кириллицы должны быть в кодировке cp1251.
        Такой способ замены не отменяет старого с помощью «#define».

        Использование представленной утилиты делает возможным программировать так:
#вставка  <iostream.h> 
#макрос  РАЗМЕР  10
main()
{   целый  массив[РАЗМЕР];
    для (целый  №=0; № < РАЗМЕР; №++)
        вывод << (массив[№] = №) << "\n";
    вернуть  0;
};
        Более развёрнутый пример использования на практике этой утилиты можно посмотреть в следующей статье «Решение системы уравнений методом Гаусса».

        Скачать утилиту транслитерации русского C/C++ в стандартный можно по этой ссылке.
Русификация

Опубликовано: 2012.09.25, последняя правка: 2023.02.27    16:21

ОценитеОценки посетителей
   ████████████████████████████ 19 (65.5%)
   █████ 3 (10.3%)
   ▌ 0
   ███████████ 7 (24.1%)

Отзывы

     2015/04/01 10:10, rst256          # 

Задача «втиснуть» её между тестовым редактором IDE и компилятором не является простой и автором она не решена.

Не согласен, даже если в IDE нет возможности прописать доп. этап перед компиляцией (хотя я даже таких не встречал) что мешает тупо в лоб подсунуть эту утилиту IDE под видом компилятора сделать свое черное дело, а потом уже оттуда вызвать сам компилятор?
И то, это гемор для тех, у кого окна, sh скрипт такое за 2 команды делает.
Даже подсветку синтаксиса и проч. можно заиметь для подобной бяки для свободных IDE. Переписать грамматику вообще нетривиальная задача, на крайний случай, если кирилические коды символов поганка не примет принципиально (а перейти на другую IDE не позволяет вероисповедание), хакаем файл шрифтов и переносим русские буквы на место латиницы. Обычно там есть доп. место для нац. символов немецкого и т.п. языков. И переопределяем таблицу транслита. Такой ход даже проприентарную IDE проймет.

     2015/12/29 15:08, МозГ3000          # 

Привет. Прикольная тема) Писать на русском клёво!

Я так понял, что по умолчанию в cpp-rus.exe уже зашиты какие-то варианты ключевых слов как напр. "вернуть" вместо return. Можно узнать полный список, чтобы не морочиться хотя бы в начале с replace.csv? Заранее спасибо.

P.S. у вас тут не упоминается, что судя по всему нужно ставить два пробела, т.к. один пробел заменяется на "_" ,что приводит к синтаксической ошибке.

P.P.S. Было бы прикольно, что бы в программах типа Notepad++ русский вариант синтаксиса тоже выделялся бы цветами. Может, у вас уже есть какие-то на эту тему наработки?

     2015/12/29 16:53, Автор сайта          # 

Выложил новую версию, где «зашит» список в replace.csv. Скачайте ещё раз, после этого replace.csv можно править, как вам хочется.

Да, нужно два пробела (или табуляция) для разделения разных слов. Если одиночный пробел в идентификаторах не устраивает, то укажите третий параметр (выше описано) .

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

     2016/03/17 10:32, rst256          # 

Поскольку транслитерация не гарантирует однозначного соответствия входного и выходного тестов, то возможны коллизии. Так, слова «пасха» и «паша» будет представлены в выходном тексте одинаково: «pasha». Но за многие годы использования этой программы подобные казусы места не имели.

А не надо вообще транслитерацию делать! Для кого её делать то? Для компилятора что ли, так ему на внешний вид плевать вообще то.
Нужно просто для каждого русского ид генерировать УНИКАЛЬНЫЙ валидный ид типа __78678 и хранить в асоц. массиве это сопоставление. И легко и просто переводить такие ид снова в богомерзкий русский вид.

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

     2016/03/17 11:48, Автор сайта          # 

Эту утилиту делал для себя, и она в таком виде меня устраивает. Делюсь ею по той причине, что никто не предлагает ничего похожего. Ваш подход, по идее, правильнее, и Вы сами могли бы сделать такую утилиту. Это совсем не сложно. Только учтите, что отладке следить за объектом «moya_peremennaya» проще, чем за объектом «__78678».

     2016/04/13 20:12, rst256          # 

Стантарты C и C++ требуют, чтобы символ # команд препроцессора был первым в строке;

Кажется, уже не требуют, смирились. Си точно, с++ я думаю тоже куда он супротив батьки то пойдет

     2016/04/13 20:27, rst256          # 

Только учтите, что отладке следить за объектом «moya_peremennaya» проще, чем за объектом «__78678».

А с чего вы взяли что я вообще увижу при отладке __78678, а увижу именно свой ид, родной так сказать. Что бы быть последовательным я перехвачу вывод компилятора и приведу его к своему виду.
a.exe gcc.exe ....
Хотя это уже немногого пижонство. И все это прекрасно прикручивается к акелпаду, конечно можно и к notepad++, но у него гораздо меньше возможностей.

     2016/04/14 02:28, rst256          # 

Если таблица окажется неупорядоченной, то утилита выдаст номер и содержимое строки, нарущающей общий порядок, и завершит работу, не выполнив создание текста на стандартном C/C++.

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

     2016/04/15 13:07, Автор сайта          # 

а то взяли моду сваливать на машину всю нудную и монотонную работы.

Вы подловили меня :) Давно само сортируется, когда надо. Надо бы старые тексты перечитать и внести правки. Всё времени нет :( Знаете, нет ни одного человека, который бы хоть что-то высказал мне — хоть плохое, хоть хорошее — по поводу этой утилиты. Никакой обратной связи. Молча скачивают и всё. И вроде бы не боты. Уже примерно 400 закачек.

     2016/07/20 13:35, Алексей          # 

Если скачивают — значит идея стоящая! Иначе ни кто бы и не качал. А это уже оценка "хорошо". Писать программы на родном языке гораздо легче и быстрее, а уж тем более разбираться в чужом коде.

     2017/08/21 11:14, bav69          # 

Похожий подход я встречал в компонентном паскале на сайте "Информатика 21". Они применяют его в системе "BlackBox", поскольку используют её для обучения программированию в школах с 1-го класса. Для детей вполне оправданный подход, а для взрослого человека, наверное, нет. Но это только мое мнение. Думаю данную утилиту можно использовать и для других языков при правильном редактировании файла "replace.csv".

     2020/09/29 12:47, Александр          # 

Проверил программу cpp-rus, весьма прогрессивная вещь! Обновляется ли программа и существует ли репозиторий?

     2020/09/30 22:50, Автор сайта          # 

Спасибо на добром слове, теперь в мыслях примеряю на себя роль прогрессора :)

ПО обновляется в 2 случаях: 1) когда в нём находятся и исправляются ошибки, 2) когда в него добавляется новая функциональность. В этой утилите русификации C/C++ много лет ошибок не обнаруживается. И полезных или стоящих идей по развитию нет. Поэтому программа давно не обновлялась.

Интереса к исходникам нет, поэтому и репозитория нет. Единственный раз у меня интересовались исходниками, когда захотели сделать русификацию языка D. На что я ответил, что утилита «потянет» и язык D, её переделывать не надо, надо только подредактировать ключевые слова в файле «replace.csv». Но исходники всё равно отослал.

Если Вам нужны исходники — пишите. Программу несколько раз переписывал с нуля, и всякий раз она становилась меньше. Так что Вам будет легко с ней знакомиться :)

     2020/10/07 00:20, MihalNik          # 

Интереса к исходникам нет, поэтому и репозитория нет.

А зря, ведь сишный синтаксис очень распространен. К тому же стандарты С++ регулярно выходят новые, продолжит ли работать с ними со всеми утилита?

     2020/10/07 12:06, Автор сайта          # 

Утилита может работать не только с C/C++, но и с D, Go, Java, Kotlin, PHP, Perl, Javascript и другими. Просто нужно править список заменяемых слов в файле «replace.csv». Ведь у неё очень простой принцип работы. Если встреченное в тексте кириллическое слово или словосочетание есть списке заменяемых слов в файле «replace.csv», то делается соответствующая замена. Если нет, то делается транслитерация. Конечно, есть нюансы, связанные с литералами, комментариями. Именно они могут помешать работать, допустим, с Паскалем. А вот принятие новых стандартов C++ никак не помешают работе утилиты :)

     2020/10/07 14:50, MihalNik          # 

Не, я про то, что даже если она успешно справляется с синтаксисом, то поддерживать списки ключевых слов и переводов тоже же надо. Это даже больше работы.

     2020/10/08 23:01, Автор сайта          # 

Надо учитывать, что не существует стандартов для русских ключевых слов. Тот же «break» можно заменять разными словами: «выйти», «прервать», «прекратить». Сокращения слов ещё добавляют вариации. Если я напишу для каждого языка программирования свой вариант замены, то я де-факто становлюсь органом стандартизации. Вот поэтому я не берусь за то, что к чему-то обязывает. Зато без стандартов можно позволить себе больше вольностей.

     2020/11/13 12:36, MihalNik          # 

Транслитерация перестает быть актуальной с поддержкой юникода
http://plana.mybb.ru/viewtopic.php?id=1345#p6164

     2020/11/13 15:47, Автор сайта          # 

Да, это новость: компилятор gcc версии 10.0 теперь поддерживает символы Юникода и, следовательно, идентификаторы на кириллице (это я расшифровываю послание от MihalNik). Когда-то это должно было произойти. Однако описываемой здесь утилите безработица пока не грозит, не все компиляторы перешли на Юникод. Хотя встроенная в компилятор поддержка Юникода — это лучше, чем внешние костыли, к которым мою утилиту можно отнести.

     2020/11/23 00:17, Денис Будяк          # 

Ключевые слова — это не пользовательские идентификаторы, их всё равно имеет смысл перевести. Хотя, возможно, для этого достаточно #define-ов.

     2020/11/23 00:47, Автор сайта          # 

Не всё можно переопределить с помощью #define. Нельзя переопределить сами define и прочие препроцессорные ключевые слова: include, ifdef, defined, endif и другие. Проверено.

     2020/11/23 13:49, Денис Будяк          # 

Такое количество можно и потерпеть. Я пытаюсь перевести Оберон, и некоторые слова рука не поднимается перевести, например, MOD. Или, скажем, Sin. Если будет несколько слов из препроцессора — это не криминал. Общее же количество ключевых слов в Си достаточно большое. Хотя кто знает, может и там грабли какие лежат и препроцессор тоже не осилит.

     2021/01/11 00:00, alextretyak          # 

Так, слова «пасха» и «паша» будут представлены в выходном тексте одинаково: «pasha».

Предлагаю заменять русскую ‘х’ на ‘kh’, чтобы исключить возможную проблему в данном случае. Так принято, например, в Википедии — см. Khabarovsk, https://en.wikipedia.org/wiki/Khabarovsk.

Компромиссное решение: заменять ‘х’ на ‘kh’ только в том случае, когда перед ‘х’ стоит буква ‘с’. (Иначе заменять ‘х’ на ‘h’.) Тогда идентификатор «длина входной строки» странслируется по-прежнему, а «пасха» заменится на «paskha».

     2021/01/11 17:51, Автор сайта          # 

Коллизия между «ш» («sh») и «сх» («sh») — не единственная. Есть ещё между «щ» («sch») и «сч» («sch»). Можно, конечно, решить проблему, но на счёт удлинения идентификаторов. А этого делать не хочется. Для меня это не баг, а фича, и жить лично мне не мешает. И жалоб не было, хотя скачали утилиту 968 раз.

     2021/01/23 20:08, stein47          # 

Идея программирования на родном языке давно уже сидела в голове. Знакомство с этим сайтом подвигло к практическим экспериментам. Поделюсь некоторыми результатами. В качестве редактора использую NotePad++. Пришлось для файлов с исходным кодом на русском использовать новые расширения .r преобразуется в .c, .rpp в .cpp и .rh в .h. Для этих расширений сделал подсветку синтаксиса, антологичную подсветке с-файлов. С помощью makefile удалось автоматизировать последовательный процесс перевода, компиляции и сборки. Чтобы все время не переключаться между русским и английским с помощью одного плагина удалось проделать интересный фокус. мак+[TAB] преобразуется в #макрос, кв или кс +[TAB] в [], фи или фс + [TAB] в {}. для преобразуется в развёрнутый шаблон цикла и тп. Единственная сложность возникла с тем, что писать код нужно в кодировке utf-8, а утилита её не поддерживает. Приходится сначала перекодировать в cp1251 и только потом использовать утилиту.
Кстати, одним из вариантов "обкатать" синтаксис нового языка, мог бы стать способ преобразования вспомогательной утилитой к одному из существующих языков, в частности к си. Не знаю на сколько удачная мысль, но почему бы и нет, для первого практического шага.

     2021/01/24 14:39, Автор сайта          # 

Чтобы угодить Вам, быстренько добавил в утилиту поддержку utf-8. Кодировки (cp866, cp1251 и utf-8) распознаются автоматически. Скачайте утилиту ещё раз. В архивный файл добавил ещё и исходники — вдруг кому захочется подробностей. Отладка свежей версии была кратковременной, так что… «Ты это, пиши на почту, если что».

     2021/01/24 18:04, stein47          # 

Пока доступен только старый вариант. Или искать где-то в другом месте?

     2021/01/24 18:40, Автор сайта          # 

Странно ведёт себя сайт.
1) По FTP залил — вижу новый размер файла и новую дату.
2) Смотрю через файл-менеджер хостера — тоже обновлённый файл.
3) Скачиваю с сайта — файл старый.
4) Удаляю файл с сайта, проверяю — файла больше нет.
5) Скачиваю с сайта — скачивается, как миленький, вот только старый.
Наверное, где-то в каких-то кэшах сидит старый файл. Видимо, придётся подождать обновления кэшей.
Напишите на почту, чтобы я ответил, прикрепив файл с новой версией. А с сайтом буду разбираться.

     2022/06/19 00:24, Автор сайта          # 

От Евгения Кирьянова поступила такая просьба:

Возникла идея реализовать виртуальную машину, а в дальнейшем русскоязычный ЯП для неё. Реализовывать я её хочу на русифицированном С, с использованием утилиты транспиляции. Исходники утилиты Вы мне когда-то любезно предоставили. С тех пор я эту утилиту значительно модифицировал, переписав большую часть кода. Возник вопрос о правомерности использования утилиты и лицензионной чистоте. Надеюсь Вас не затруднит, высказать своё отношение к вопросу? По возможности на какой-нибудь общественной площадке.

Даю юридически обязывающий ответ:

Разрешаю Евгению Кирьянову безвозмездно использовать и модифицировать указанную утилиту, а так же передавать это право третьим лицам при условии, что эта утилита и проекты на её основе не будут использованы в ущерб мне и стране, в которой я проживаю. На имущественные авторские права не претендую, неимущественные же авторские права (право признаваться автором произведения или право авторства) оставляю на усмотрение и добрую волю пользователей утилиты.

Аминь.

Теперь можно сделать снимок этой страницы и нотариально его заверить или воспользоваться соответствующим сервисом в Интернете. Или дождаться, пока какой-нибудь архиватор Интернета (например, archive.org) не сделает снимок этой страницы.

     2023/01/12 22:00, Автор сайта          # 

Нашёл в утилите изъян, который меня не устроил. Не стал утешать себя, что это не баг, а фича, просто переделал её. Суть изъяна была в том, что текст в кодировках cp866 (DOS) и utf-8 целиком преобразовывался в кодировку cp1251 (Windows), а затем делалась транслитерация идентификаторов. Теперь преобразуется не целиком, для литералов вида «А-Я» и «а-я» делается исключение: их кодировка не меняется.

     2023/02/20 11:08, kiv          # 

Ссылка
[Скачать утилиту транслитерации русского C/C++ в стандартный можно по этой ссылке.]
[http://compiler.su/download.php]
умышленно никуда не ведёт?

     2023/02/20 15:37, Автор сайта          # 

Да, промашка вышла. Исправил, можно скачивать.

     2023/02/27 16:50, Автор сайта          # 

Заметил, что при увеличении количества файлов, подлежащих транслитерации, увеличивается ожидание результата. Связано это с тем, утилита делает транслитерацию только одного файла, и для транслитерации N файлов требуется N её вызовов. Переделал утилиту так, чтобы ей можно было передать произвольное количество имён файлов. Это сразу дало визуально заметный эффект: транслитерация стала практически мгновенной. Но это повлекло за собой изменение синтаксиса вызова. Теперь он таков:
cpp-rus <infile 1><'~'|'!'><outfile 1> . . . <infile N><'~'|'!'><outfile N>
Все имена файлов передаются парами, без пробелов. Имя читаемого файла отделяется от имени записываемого файла символом «~» или «!». Символ «~» означает, что в идентификаторах одиночные пробелы допустимы и они заменяются на символ нижнего подчёркивания «_».
Символ «!» означает, что эти пробелы не допустимы. Пары имён файлов разделяются пробелами. Например:
 cpp-rus a~a.cpp bc.rh~bc.h cde!cde.c
В этом примере делается транслитерация файла «a» в файл «a.cpp», файла «bc.rh» в файл «bc.h» и файла «cde» в файл «cde.c». Последнее преобразование делалось без замены одиночных пробелов в идентификаторах на символ нижнего подчёркивания.

     2023/03/04 13:21, stein47          # 

Я пошел по другому пути. Для автоматизации обработки большого количества файлов я использовал make. В соответствии с Makefile make запускает утилиту cpp-rus столько раз, сколько необходимо. Выгода использования make ещё и в том, что при повторной обработке и сборке проекта транспиляции и компиляции подвергаются только измененные файлы. Есть ещё одна хитрость: если Ваша утилита будет помещать в начало С-шного файла строку:

#line " имя_исходного_файла.r" 1

то в случае ошибки компилятор будет ссылаться на исходный файл на русифицированном С.

     2023/03/05 14:51, Автор сайта          # 

транспиляции и компиляции подвергаются только измененные файлы

Да, была мысль сравнивать время изменения входного и выходного файла. Но пока что скорость преобразования устраивает. Вот будут проекты огромных размеров — тогда займёмся. Но, думаю, скорее я напишу компилятор своего языка и буду программировать на нём, чем у меня появятся большие проекты на Си :)

в случае ошибки компилятор будет ссылаться

Нет, стало хуже. Пишет номер строки, где #line, а не где ошибка.

     2023/03/05 15:41, stein47          # 

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

     2023/03/05 19:39, Автор сайта          # 

tcc чрезвычайно аскетичный компилятор, спасибо, что хоть пишет, в какой строке ошибка. Само сообщение подробностями не блещет, в основном там написано «Identifier expected». Порою бесит, когда не можешь увидеть причины ошибки. Поэтому сейчас при написании лексического анализатора сообщения об ошибках стараюсь делать как можно более подробными. Благо, отказ от средств типа LEX/YACC развязывает руки.

     2023/03/05 21:57, stein47          # 

У меня есть заготовка для лексера на русифицированном Си. Задумывалась, как шаблон, на котором легко было бы реализовать лексер для любого языка. Правда, там нет самого интересного: идентификаторов и чисел, пока не пришла мысль, как сделать оптимальнее. Если интересно, готов поделиться.

     2023/03/06 01:25, Автор сайта          # 

Зато оно (то самое, что интересное) есть у меня. Я прописал Вам права на доступ к закрытым статьям. Авторизуйтесь, заходите в «Описание языка», там черновики описания многих лексем. Если есть какое-то описание, то значит оно реализовано в лексическом анализаторе — стараюсь, чтобы работа шла синхронно.

Добавить свой отзыв

Написать автору можно на электронную почту
mail(аt)compiler.su

Авторизация

Регистрация

Выслать пароль

Карта сайта


Содержание

Каким должен быть язык программирования?

Анализ и критика

Описание языка

Компилятор

Отечественные разработки

Cтатьи на компьютерные темы

Компьютерный юмор

Новости и прочее

●  Политика размещения комментариев и статей

●  Предложения и замечания

●  Все голосования

●  Компьютерные ребусы и этюды для программистов

●●  Найти минимум из двух положительных целых чисел без операций сравнения

●  Утилита транслитерации русского C/C++ в стандартный

●  Решение системы уравнений методом Гаусса. Программа на русском C++

●  Вычисление определителя матрицы. Программа на русском Си




Последние отзывы

2024/06/17 11:49 ••• Gudleifr
О превращении кибернетики в шаманство

2024/06/12 11:27 ••• Автор сайта
Все языки эквивалентны. Но некоторые из них эквивалентнее других

2024/05/31 12:31 ••• Прохожий
Идеальный транслятор

2024/05/28 15:16 ••• Прохожий
Русской операционной системой должна стать ReactOS

2024/05/25 17:18 ••• Прохожий
Избранные компьютерные анекдоты

2024/05/11 16:33 ••• Автор сайта
Энтузиасты-разработчики компиляторов и их проекты

2024/04/28 15:58 ••• Автор сайта
Обработка ошибок

2024/04/23 00:00 ••• alextretyak
Признаки устаревшего языка

2024/04/21 00:00 ••• alextretyak
Постфиксные инкремент и декремент

2024/04/20 21:28 ••• Бурановский дедушка
Русский язык и программирование

2024/04/01 23:39 ••• Бурановский дедушка
Новости и прочее

2024/03/22 20:41 ••• void
Раскрутка компилятора

2024/03/20 19:54 ••• kt
О многократном резервировании функций