Hlavní navigace

Makro procesor GNU m4

24. 9. 2001
Doba čtení: 3 minuty

Sdílet

V dnešním článku se seznámíme s užitečnou utilitou GNU: makro procesorem m4. Makro procesor je aplikace pracující s textem. Čte nějaký textový soubor a nahrazuje v něm smluvené řetězce (makra) jejich definovaným významem. Nejedná se ale o pouhé nahrazování jednoho řetězce jiným -- vestavěná makra procesoru m4 dovolují provádět různé operace jako vkládání souborů, integerovou aritmetiku, různé manipulace s textem nebo volání Unixových příkazů.

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.

CS24_early

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ě.

Byl pro vás článek přínosný?

Autor článku

Michal Burda vystudoval informatiku a aplikovanou matematiku a nyní pracuje na Ostravské univerzitě jako odborný asistent. Zajímá se o data mining, Javu a Linux.