Ada 95: изменение вывода словарной программы

Я нашел этот словарь Уильяма Уитакера в Интернете, и мне нравится его возможности синтаксического анализа. Но результат мне не подходит.

Проблема (проблема для меня):

При такой форме ввода, как «audiam», программа возвращает следующий вывод (простой текст):

audi.am              V      4 1 PRES ACTIVE  SUB 1 S    
audi.am              V      4 1 FUT  ACTIVE  IND 1 S    
audio, audire, audivi, auditus  V (4th)   [XXXAO]  
hear, listen, accept, agree with; obey; harken, pay attention; be able to hear;

Но я просто хочу получить следующий текстовый вывод (тот же ввод: audiam):

audiam=audio, audire, audivi, auditus

Это:

InputWord=Dictionary_Forms

Так что некоторая информация мне не нужна.

Как я могу изменить вывод этой программы, изменив код Ada?

У меня нет никаких знаний об Ada, но я знаю Delphi / Pascal, поэтому разобраться в коде довольно легко, не так ли? Значит, части, вызывающие вывод текста, кажутся операторами TEXT_IO.PUT(...), верно? Все они вызываются в list_package.adb, так что это, вероятно, исходный файл, на который стоит обратить внимание.

Что конкретно нужно изменить?

Полный исходный код этой программы на Ada 95 доступен на этой странице.

Я надеюсь, что некоторые из вас понимают код Ada 95. Заранее большое спасибо!

Мои проблемы с компиляцией:

Для использования на компьютере с Windows я загрузил MinGW и попытался скомпилировать исходные файлы с помощью «MinGW Shell». Но это был мой вклад и ответ оболочки:

Ответ оболочки MinGW

Компиляция с использованием последней версии Cygwin:

Когда я компилирую программу с использованием последней версии Cygwin, сообщения об ошибке нет:

введите описание изображения здесь

Существует даже файл .exe, который создается. Его размер составляет 1,6 МБ (1 682 616 байт). Но когда открываю, сразу закрывается. Что пошло не так?


person caw    schedule 20.04.2011    source источник
comment
Должны ли мы предполагать, что на выходе получается текст? постобработка текста не вариант?   -  person NWS    schedule 20.04.2011
comment
Я согласен с @NWS, если вы не заинтересованы в изучении Ada (и да, некоторые из нас могут понять Ada 95), я бы просто отфильтровал вывод через какой-нибудь сценарий оболочки / Python / Perl / awk / любой другой.   -  person Marc C    schedule 20.04.2011
comment
Спасибо за эти два комментария :) Да, на выходе получается (простой) текст. Я добавил эту информацию в вопрос выше. И простая фильтрация вывода каким-либо скриптом (лучше всего: PHP) тоже подойдет. Но лучшим решением, конечно же, была бы модификация программы Ada.   -  person caw    schedule 20.04.2011
comment
Последующая фильтрация - довольно сложная задача, поскольку выходные данные могут иметь множество различных форм. Так что изменить код Ada заранее, чтобы получить правильный результат, намного проще. А поскольку у меня средние знания Delphi / Pascal, код Ada легко понять.   -  person caw    schedule 23.04.2011
comment
Для справки, вы можете щелкнуть правой кнопкой мыши по строке заголовка окна оболочки, чтобы пометить текст для копирования. Так редактировать немного проще.   -  person trashgod    schedule 25.04.2011


Ответы (3)


Слова Уильяма Уитакера - это удобный инструмент. Возможно, вы сможете найти версию, уже созданную для вашей платформы. Я не менял код, но вы можете изменить некоторые вещи, используя различные параметры. Он даже размещен в Интернете. Если у вас есть компилятор Ada, я включил последний Makefile, который использовал. Это немного тонкая абстракция, но она включает в себя основные шаги по компиляции программы и утилит, а также шаги по созданию словарей.

TARG = words
ARGS = -O

$(TARG): *.ad[bs]
    gnatmake $(TARG) $(ARGS)

all: $(TARG)
    gnatmake makedict $(ARGS)
    gnatmake makeinfl $(ARGS)
    gnatmake makestem $(ARGS)
    gnatmake makeefil $(ARGS)
    @echo Please make the dicitionary
    @echo ./makedict DICTLINE.GEN
    @echo ./makestem STEMLIST.GEN
    @echo ./makeefil EWDSLIST.GEN
    @echo ./makeinfl INFLECTS.GEN

debug:
    gnatmake -g $(TARG)

clean:
    rm -f *.o *.ali b~* core

cleaner: clean
    rm -f *.s makedict makeinfl makestem makeefil

cleanest: cleaner
    rm -f $(TARG)

Приложение: один из подходов - использовать gcc 4.4.3 в Ubuntu 10.04 с обновленным Makefile, указанным выше. Для удобства я использовал VirtualBox для размещения экземпляра Linux.

$ gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Вот небольшой тест с использованием названия моего второго любимого отрывка из Катулли Кармина .

$ ./words odi et amo
odi                  V      6 1 PRES ACTIVE  IMP 2 S    
odeo, odire, odivi(ii), -  V TRANS   [EXXCW]    Later
od.i                 V      4 1 PRES ACTIVE  IMP 2 S    
odio, odire, odivi, -  V (4th) TRANS   [FXXCF]    Medieval
hate; dislike; be disinclined/reluctant/adverse to; (usu. PREFDEF);
odi                  N      2 4 GEN S N                   Early   
odium, odi(i)  N (2nd) N   [XXXAO]  
hate/hatred/dislike/antipathy; odium, unpopularity; boredom/impatience;
hatred (manifested by/towards group), hostility; object of hate/odium;
od.i                 V      3 1 PERF ACTIVE  IND 1 S    
odi, odisse, osus  V (3rd) PERFDEF   [XXXBX]  
hate (PERF form, PRES force), dislike; be disinclined/reluctant/adverse to;

et                   CONJ                               
et  CONJ   [XXXAX]  
and, and even; also, even;  (et ... et = both ... and);

am.o                 V      1 1 PRES ACTIVE  IND 1 S    
amo, amare, amavi, amatus  V (1st)   [XXXAO]  
love, like; fall in love with; be fond of; have a tendency to;

Приложение: после того, как вы его запустили, проблема его модификации остается. grep для Put_Line\( показывает 629 совпадений; большинство из них находится в line_stuff и list*. Вот с чего я бы начал. Пока вы изучаете Ada, есть несколько хороших руководств здесь.

person trashgod    schedule 20.04.2011
comment
Спасибо за этот ответ :) Четыре ссылки, которые вы упомянули первыми, интересны, но я, конечно, знаю их все;) Я уже пробовал это. Нет официальной версии, которая делает то, что мне нужно. Но не могли бы вы помочь мне составить его? Это было бы прекрасно. Как видно из моего вопроса, у меня есть некоторые трудности. - person caw; 23.04.2011
comment
Я получаю тот же результат с MinGW gcc 4.5.2, но не с Mac OS gcc 4.3.4. Использование параметра компилятора -gnatl показывает, что компиляция завершается, но -S умирает после записи единственной строки исходного кода ассемблера. Я в замешательстве. - person trashgod; 23.04.2011
comment
Не знаю, правильно ли вы меня поняли: я хочу скомпилировать эту программу для использования в Windows с изменением вывода на формат, который я описал. Версия для UNIX была бы еще лучше, но в этом нет необходимости. Подойдет такая версия: users.erols.com/whitaker/wordswin.htm - person caw; 24.04.2011
comment
Один и тот же исходный код компилируется в Mac OS (gcc 4.3.4) и Ubuntu (gcc 4.4.3), как показано выше. AFAIK, сбой с MinGW (gcc 4.5.2) - это ошибка компилятора; Я не знаю, как обойтись. Вы пробовали Cygwin? - person trashgod; 24.04.2011
comment
Хорошие новости! Он отлично собирается и работает с Cygwin gcc 3.4.4. - person trashgod; 24.04.2011
comment
Большое спасибо за поддержку и тестирование cygwin. Где я могу получить это? На той странице, на которую вы перешли, нет ссылки для скачивания. Просто текстовая информация о выпусках. - person caw; 24.04.2011
comment
Я загрузил Cygwin с сайта ‹cygwin.com/setup.exe ›. Результаты моей попытки компиляции описаны в моем вопросе выше. Он по-прежнему работает некорректно, но я сделал еще один шаг :) - person caw; 24.04.2011
comment
Теперь выполните make all, чтобы получить четыре утилиты словарей и список из четырех команд, необходимых для построения словарей. Подробнее см. здесь. - person trashgod; 25.04.2011
comment
Большое спасибо, trashgod! Теперь все работает :) Единственная проблема в том, что я не знаю, какие отрывки изменять. - person caw; 25.04.2011
comment
Я тоже, но я уточнил выше. - person trashgod; 25.04.2011
comment
Ваш ответ, очевидно, лучший. Большое тебе спасибо! - person caw; 26.04.2011
comment
Добро пожаловать. Мне давно нравится семейство языков Algol-PL / 1-Pascal-Modula-Ada, и участники здесь всегда готовы помочь, когда возникают новые вопросы. Вам также может понравиться comp.lang.ada. - person trashgod; 26.04.2011

Как бы мне ни нравилась Ада, и я бы посоветовал вам изучить минимальную сумму, которая потребуется, чтобы взломать ее так, как вы хотите ...

На самом деле вы запрашиваете простой фильтр данных, что было бы довольно легко выполнить, направив свой вывод в awk. Если вы работаете с какой-либо разновидностью Linux, у вас уже есть awk (и вам действительно стоит научиться ее использовать). Если вы работаете в Windows, вы можете получить awk и множество других полезных вещей из MinGW, который является одним из из мест, где вам все равно нужно было бы пойти, чтобы получить компилятор Ada.

Если вам нужен компилятор Windows Ada, я бы предложил получить оттуда GNAT / GCC. Две другие доступные разновидности, GNAT / GPL и GNAT / PRO, доступны у AdaCore (сопровождающие). Однако GNAT / PRO необходимо приобрести, и GNAT / GPL предоставляет дистрибутивы любой программы, скомпилированной с использованием этой GPL. Я полагаю, вы можете не возражать против применения GPL к вашей программе, но я полагаю, что это недостаточно серьезная потребность для получения коммерческой поддержки.

Если вы работаете в Linux, компилятор GNAT Ada должен быть доступен с GCC в качестве опции (если он не установлен по умолчанию). Те же два других варианта от AdaCore, конечно, доступны и там, если хотите.


Итак, вы спросили об изучении Ada. На самом деле, если вы знакомы с другими компилируемыми процедурными языками (например, C / C ++, Java, Pascal, Modula-2 и т. Д.), У вас не должно возникнуть особых проблем с их освоением. Этот вопрос касается книг Ada. Для себя я обычно просто использую официальную LRM как ссылка. В отличие от большинства языков, у Ada есть международно стандартизированное Справочное руководство по языкам, которое доступно в Интернете бесплатно. Кроме того, в таких случаях он вполне читается.

person T.E.D.    schedule 20.04.2011
comment
GNAT / GPL отображает любую программу, скомпилированную с ее использованием, GPL - это утверждение неверно. вы должны уважать это только в том случае, если вы распространяете его в двоичной форме. - person Rommudoh; 20.04.2011
comment
@oenone - Дело в том, как на это смотреть. GPL обременяет вас только тогда, когда вы пытаетесь распространять программу. Постараюсь сделать понятнее. - person T.E.D.; 20.04.2011
comment
IIUC, версии, скомпилированные из FSF, сохраняют исключение GMGPL. - person trashgod; 21.04.2011
comment
+1 за постобработку. Программа мне очень нравится, но интерфейс своеобразный. - person trashgod; 21.04.2011
comment
@trashgod - в основном это то, что я называю GNAT / GCC (GNAT / FSF - лучшее имя?) В Windows вы можете получить двоичные файлы от людей из MinGW. - person T.E.D.; 21.04.2011
comment
Да ну, я совсем забыл про MinGW; Спасибо за напоминание! Я не уверен в лучшем названии; gcc --version показывает авторское право FSF, это то место, где я приобрел эту привычку. - person trashgod; 21.04.2011
comment
Спасибо за эту подробную информацию о компиляторах Ada :) Я выбрал MinGW для использования на моей машине с Windows. Но при компиляции возникают проблемы. Было бы здорово, если бы вы могли еще раз взглянуть на мой вопрос. - person caw; 23.04.2011
comment
Так что я определенно хочу изучить это минимальное количество Ады, чтобы изменить эту программу. Я бы не хотел выбирать постобработку. Меня не волнует, должна ли скомпилированная программа распространяться под GPL или нет. Так что GNAT / GPL мне тоже подойдет. - person caw; 24.04.2011
comment
Спасибо за правку, так что теперь у меня есть интересные ссылки для изучения Ады. - person caw; 26.04.2011
comment
@Marco W. - Я также предлагаю попробовать некоторые ссылки в теге SO Ada (stackoverflow.com/tags/ada/info). Там много хорошего. - person T.E.D.; 27.04.2011

О компиляции: вы можете использовать GNAT. Он поддерживает Ada83, Ada95 и Ada05. Чтобы указать ему использовать Ada95, используйте переключатель -gnat95.

Вы можете получить его на http://libre.adacore.com/.

person Rommudoh    schedule 20.04.2011
comment
Кроме того, gnatmake свободно доступен на платформах типа Linux. - person NWS; 20.04.2011
comment
Разве теперь gnat не является стандартной частью установки gcc? Я знаю, что получу это с Мингв. - person T.E.D.; 20.04.2011
comment
gnatmake является частью gnat. Я бы не назвал это частью стандартной установки gcc, поскольку в основном он поставляется в виде собственного пакета. Есть различия между gcc-gnat и gnat gpl, вы можете посмотреть на них. - person Rommudoh; 20.04.2011
comment
Да, хотя я верю в основном в инструментальный отдел. Например, addr2line.lib существует только как часть gnat gpl, поэтому вы не можете (легко) выполнить символическую обратную трассировку изнутри работающей программы с помощью gnat gcc. - person T.E.D.; 20.04.2011