Autorem GNU m4 je René Seindal. Kořeny m4 sahají až do šedesátých let minulého století k předchůdci nazvanému GPM. GNU m4 je k dispozici na mnoha platformách. Navíc, hodně systémů jej má určitě nainstalováno. Může za to z velké části oblíbený GNU autoconf, který ho potřebuje ke generování configure skriptů.
S m4 dostáváte do ruky nástroj, který vám ulehčí psaní rutinních textů. Jeho uplatnění je jistě rozmanité. Sám jej velice rád používám ke správě statických HTML stránek a při psaní těchto článků :-).
Motivace
Provedu motivační úvod – ukázku možného zdrojového souboru m4, ze kterého se generuje statická HTML stránka:
include(`homepage.m4') zahlavi sekce(`Úvod') <P> Vítejte na mých WWW stránkách! ... zapati
Místo částí, které se na každé stránce opakují (jakési záhlaví a zápatí), píšeme makra procesoru m4. Má to tu výhodu, že vzhled jednotlivých prvků se specifikuje jenom jednou – při definici makra. Budete-li chtít kdykoliv v budoucnu zcela „překopat“ vizáž svých stránek, omezíte se v podstatě jen na editaci maker, ze kterých jsou stránky generovány.
Jak se m4 spouští
GNU m4 pracuje jako obyčejný filtr z příkazové řádky. Na tomto místě nebudu popisovat jeho volby – možná někdy v dalších pokračováních, až se s m4 trochu více seznámíte.
Makro procesor tedy můžete spustit
m4
pokud chcete příkazy zkoušet interaktivně, nebo příkazem
m4 zdroj > vystup
pro dávkové zpracování souboru zdroj na vystup.
Jak m4 čte vstup
Dříve než přistoupíme k popisu vestavěných funkcí a k definici vlastních maker, musíme si říct něco o tom, jak m4 postupuje ve zpracování textu. Ale úplně nejprve úmluva o značení uživatelského vstupu a zpracovaného výstupu:
Toto je vstup uživatele. => Toto je výstup procesoru m4. E> Toto je chybový výstup procesoru m4.
Pro náš výklad o zpracovávání vstupu procesorem m4 výhodně poslouží představa, že m4 je jakési zařízení, které má dvě pásky: vstupní a výstupní. Toto zařízení postupně ukusuje ze vstupní pásky části textu, zvané tokeny. Tokenem jsou slova, řetězce v uvozovkách a ostatní znaky. Naše „zařízení“ vstupní pásku čte od začátku a přečtené části „odtrhává“, takže na vstupní pásce je v každém okamžiku vždy jen zbývající (nezpracovaný) text – přečtené a zpracované části se „vyhazují“.
Slova tvořená posloupností písmen anglické abecedy, čísel a podtržítek („_“), jejímž prvním znakem není číslice (zapsáno regulárním výrazem: [_a-zA-Z][_a-z-A-Z0–9]*), jsou potenciálními názvy (identifikátory) maker. Pokaždé, když m4 takové slovo načte, kontroluje, nemá-li přiřazeno nějaký význam. Pokud ne, slovo jednoduše zapíše na výstup. V kladném případě naopak dochází k expanzi makra.
Typickými představiteli identifikátorů maker mohou být například řetězce: makro1, _tmp nebo zvyrazni. Nevhodnou volbou názvu makra může dojít k nežádoucím účinkům, kdy bude jako volání makra považován i výskyt obyčejného slova v textu. Vhodným výběrem názvů (nebo nestandardním nastavením procesoru) se tomu dá poměrně dobře vyhnout.
Dalším typem tokenů, se kterými m4 pracuje, jsou řetězce v uvozovkách. Je to jakákoliv posloupnost znaků uzavřená mezi levou („`“) a pravou („‚“) jednoduchou anglickou uvozovku. Uvnitř řetězce musí mít všechny výskyty „`“ odpovídající uzavírací „‘“. Uvozené řetězce slouží k potlačení expanze maker. Výsledek průchodu řetězce v uvozovkách procesorem m4 je samotný řetězec s odstraněnou vnější úrovní uvozovacích znaků. Jinými slovy, narazí-li m4 na vstupní pásce na otevírací „`“, načte najednou bez jakéhokoliv dalšího zpracovávání celý řetězec až po ukončující „‚“. Přitom bere v úvahu, kolik dalších otevíracích symbolů potkal; tolik uzavíracích závorek do řetězce vloží, než čtení tokenu ukončí. Načtenému řetězci pak odsekne okrajové „`“ a „‘“ a výsledek zapíše na výstup.
Zde jsou ukázky možných vstupů a výstupů:
`Ahoj!' => Ahoj! `Vnořený `uvozený řetězec'' => Vnořený `uvozený řetězec'
Pokračování příště.