Projekt zakończony
Paweł Marek, pmarek@student.agh.edu.pl
Kolorowanie składni języka Prolog dla GNU Enscript. Patrz realizacja dla GeSHi.
Poniżej zamieszczam wyniki wykonania projektu kolorowania składni języka Prolog w GNU Enscript.
prolog.st
/** * Name: prolog * Description: Prolog (PROgramming in LOGic) programming language. * Author: Pawel Marek <p.marek@student.agh.edu.pl> */ state prolog extends HighlightEntry { /* Comments. */ /\/\*/ { comment_face (true); language_print ($0); call (c_comment); comment_face (false); } /* Comments. */ /%/ { comment_face (true); language_print ($0); call (eat_one_line); comment_face (false); } /* String constants. */ /'/ { string_face (true); language_print ($0); call (prol_string); string_face (false); } /* String constants. */ /\"/ { string_face (true); language_print ($0); call (c_string); string_face (false); } /* Symbols. */ /+|-|*|\/|\\\\|\^|<|>|=|~|:|\.|,|?|@|#|\$|&/ { keyword_face (true); language_print ($0); keyword_face (false); } /* Brackets. */ /\[|\]|\(|\)/ { function_name_face (true); language_print ($0); function_name_face (false); } /* Predicates. */ /([A-Z])([a-zA-Z0-9]*)/ { bold (true); language_print ($0); bold (false); } /* Numbers. */ /([0-9])/ { type_face (true); language_print ($0); type_face (false); } } state prol_string extends Highlight { /\\\\./ { language_print ($0); } /'/ { language_print ($0); return; } } /* Local variables: mode: c End: */
Enscript konwertuje pliki tekstowe do formatu PostScript lub innego języka wyjściowego (HTML, RFT, ANSI). Program potrafi zapisać wynik swojego działania w pliku lub wysłać bezpośrednio do drukarki. Jeżeli podczas wywołania nie podano pliku wejściowego enscript przetwarza wejście standardowe (stdin). Enscript może być rozbudowywany do obsługi wielu mediów wyjściowych i posiada szereg opcji konfigurowalnych, które mogą być używane do dostosowywania wydruków do swoich potrzeb. Jednym ze sposobów wykorzystania programu jest kolorowanie składni. Enscript w najnowszej swojej wersji 1.6.4 posiada obsługę kolorowania składni kilkudziesięciu języków, m.innymi: ADA95, C, C++, Delphi, Fortran, VHDL, HTML. Moim zadaniem było dopisać definicje kolorowania składni języka Prolog.
Program po zainstalowaniu umieszcza swoje pliki konfiguracyjne w /usr/local/share/enscript. Zagłębiając się dalej w strukturze katalogów /usr/local/share/enscript/hl znajdują się pliki z definicjami kolorowania składni poszczególnych języków. Między nimi znajduje się główny plik kolorowania składni enscript.st w którym znaleźć można wskazówki jak należy pisać nowe reguły.
Aby sprawdzić jakie reguły podświetlania składni podsiada Enscript należy wydać polecenie:
enscript --help-pretty-print
Wywołanie zwraca nazwę języków, krótkie opisy i autorów reguł.
Z powodu braku dokumentacji GNU Enscript dotyczących reguł podświetlania składni podczas pisania projektu korzystałem praktycznie tylko z zaleceń zawartych w pliku enscript.st oraz z analizy istniejących już reguł dla innych języków.
Instalacja reguł podświetlania składni Prologu polega na skopiowaniu pliku prolog.st do katalogu /usr/local/share/enscript/hl gdzie znajdują się inne reguły. Program podczas działania sprawdza czy dane reguły są w katalogu i w razie problemów zgłasza błędy.
Aby skorzystać z podświetlania składni Prologu należy wydać polecenie:
enscript nazwa_pliku -Eprolog --color --output=nazwa_pliku.ps
Opcja -E wskazuje jakie reguły podświetlania składni mają zostać użyte. Druga opcja –color włącza bogatsze wyniki o kolory (domyślnie wyniki są tylko pogrubiane). Ostatnia opcja –output sprawia iż wyniki zapisywane są w pliku o podanej po znaku równości nazwie.
Przykładowe wyniki. Plik wejściowy:
/* * family.pl * taken from Bratko, 3rd ed, ch.1, p.17 * */ parent(pam,bob). parent(tom,bob). parent(tom,liz). female(pam). female(liz). female(pat). male(tom). male(bob). male(jim). mother(X,Y) :- parent(X,Y), female(X). father(X,Y) :- parent(X,Y), male(X).
Plik wynikowy:
http://lavica.fesb.hr/cgi-bin/info2html?(enscript)Writing%20New%20Highlighting%20Definitions
http://lavica.fesb.hr/cgi-bin/info2html?(enscript)Output%20Languages
/usr/local/share/enscript/hl/enscript.st