Hlavní navigace

Makro procesor GNU m4

Michal Burda 24. 9. 2001

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.

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

Našli jste v článku chybu?

25. 9. 2001 18:18

Milos (neregistrovaný)

To, ze je vys, neznamena, ze byla napsana driv. Podivej se na cas zpravy.
Ale jako odpoved mi to staci. :-)


24. 9. 2001 17:11

Petr Mach (neregistrovaný)

Hmm, odpoved je o neco vys :-).

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Lupa.cz: Seznam mění vedení. Pavel Zima v čele končí

Seznam mění vedení. Pavel Zima v čele končí

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

Vitalia.cz: Z tohoto konopí dělají léčivé masti

Z tohoto konopí dělají léčivé masti

Měšec.cz: Jak levně odeslat balík přímo z domu?

Jak levně odeslat balík přímo z domu?

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Vitalia.cz: Dáte si jahody s plísní?

Dáte si jahody s plísní?

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

Lupa.cz: Babiš: E-shopů se EET možná nebude týkat

Babiš: E-shopů se EET možná nebude týkat

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Podnikatel.cz: Babiš: E-shopy z EET možná vyjmeme

Babiš: E-shopy z EET možná vyjmeme

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy