Vstupem je soubor, jehož jméno je jediným parametrem příkazové řádky.
Vstupní soubor se zpracovává po řádkách, ve vstupním pořadí.
Zpracovaný soubor vypisujte na standardní výstup.
Každá řádka je dělena na tokeny těchto druhů:
- slovo = posloupnost písmen (std::isalpha)
- číslo = posloupnost číslic (std::isdigit) tvořící kladné celé číslo v dekadickém zápise
- rovnítko = symbol "="
Řádky jsou dvou druhů:
- definice = řádka začínající tokeny slovo a rovnítko. Počáteční slovo definuje název makra, obsahem makra je posloupnost tokenů za rovnítkem (může být i prázdná). Tato posloupnost může obsahovat slova a čísla - ta představují odkazy na parametry makra (číslovány od 1). Nejvyšší číslo vyskytující se za rovnítkem definuje aritu makra. Ne všechny parametry makra musejí být použity (poslední ale bude použit vždy), některé mohou být použity vícekrát.
- normální řádka = řádka obsahující pouze slova.
Zpracování normální řádky probíhá vždy zleva doprava.
Pokud je nalezeno slovo shodné s názvem viditelného makra M, je toto slovo z aktuálního obsahu řádky odebráno společně s n dalšími slovy p1..pn, kde n je arita makra M. Odebraná (n+1)-tice slov je nahrazena obsahem makra M, přičemž každé číslo v obsahu makra je nahrazena příslušným slovem z posloupnosti p1..pn. Výsledkem nahrazení makra je tedy vždy posloupnost slov stejně dlouhá jako obsah makra.
Nahrazování maker se opakuje do té doby, dokud se na řádce vyskytuje název viditelného makra, nahrazuje se vždy první výskyt zleva.
Výsledná posloupnost tokenů je, oddělena mezerami, vypsána jako další řádek do výstupního souboru.
Implementace musí přežít bez pádu, zacyklení nebo vyčerpání paměti všechny vstupy včetně vadných. Diagnostika vadných vstupů není vyžadována - výstup programu pro chybné vstupy není předepsán.
Chybné vstupy zahrnují zejména tyto situace:
- řádky nejsou správně tokenizovány nebo obsahují nepovolené znaky
- rovnítko vyskytující se jinde než na druhé pozici
- číslo vyskytující se jinde než za rovnítkem
- použití makra, za kterým nenásleduje dostatečný počet tokenů pokrývající aritu makra
- nekonvergující rekurzivní aplikace makra
- řádka se rozvíjením makra příliš prodloužila
- rozvíjení makra na téže pozici se opakuje příliš dlouho