General-purpose macro processor
This article needs additional citations for verification. (September 2011) (Learn how and when to remove this template message)
A macro processor is a program that copies a stream of text from one place to another, making a systematic set of replacements as it does so. Macro processors are often embedded in other programs, such as assemblers and compilers. Sometimes they are standalone programs that can be used to process any kind of text.
Macro processors have been used for language expansion (defining new language constructs that can be expressed in terms of existing language components), for systematic text replacements that require decision making, and for text reformatting (e.g. conditional extraction of material from an HTML file).
Examples of general purpose macro processors
|GPM||1960s||One of the earliest macro processors was GPM (the General Purpose Macrogenerator). This was developed at the University of Cambridge, UK, in the mid 1960s, under the direction of Christopher Strachey.|
|ML/I||1960s||One particularly important general purpose macro processor was (and still is) ML/I (Macro Language One). This was developed as part of PhD research by a Cambridge postgraduate, Peter J. Brown. ML/I operates on a character stream, and requires no special format for its input, nor any special flag characters to introduce macros.
|aa_macro||2017||aa_macro is an open-source character-stream-based text processing language written in Python. Text is processed in a left-to-right, inside-to-outside manner. A selection of pre-defined built-in functions provide fundamental processing mechanisms that may be used directly or as elements of user-defined styles. The language is user extensible, and wtfm, an open-source web-based document preparation wrapper for the language, is available.|
|STAGE2||1960s||A contemporary of ML/I was STAGE2, part of William Waite's Mobile Programming System. This too is a general purpose macro processor, but it processes input a line at a time, matching each line against specified patterns; it is notable in that it is independent of character set, requiring only that the digits 0-9 are contiguous.|
|TTM||1968||TTM is a recursive, interpretive language designed primarily for string manipulation, text editing, macro definition and expansion, and other applications generally classified as systems programming. It was developed in 1968 by Steven Caine and E. Kent Gordon at the California Institute of Technology. It is derived, primarily, from GAP and GPM.|
|GMP||1970s||Another attempt was the GMP (General Macro Processor) developed in the mid-1970s by M Boule in the DLB/GC department of the CII Company along ideas from R.J. Chevance. Tested in association with the Bordeaux I University the first version ran the SIRIS8/IRIS80 System. It was ported to mini6 systems and was the main component involved in the system generation for this family of computers. The GMP processor used C2-Chomsky grammars to define the syntax of macros and used an imperative language to execute computations and proceed to macro expansion.|
|gema||1995||gema is a contextual macro processor based on pattern matching, written by David N. Gray. It replaces/enhances the concept of regular expressions by contexts. Contexts roughly corresponds to named sets of patterns. As a consequence, macros in gema closely resemble an EBNF description.|
|GPP||1996||gpp is another general macro processor written by Denis Auroux. It resembles a C preprocessor, but has more general semantics and allows for customized syntax (for instance, TeX, XHTML, and Prolog-like scripts are definable).|
|M5||1999||m5 is a general-purpose macro processor written by William A. Ward, Jr. Unlike many macroprocessors, m5 does not directly interpret its input. Instead it uses a two-pass approach in which the first pass translates the input to an awk program, and the second pass executes the awk program to produce the final output.|
|pyexpander||2011||pyexpander is a general-purpose macro processor based on the Python programming language. In addition to simple macro replacement it allows evaluation of arbitrary Python expressions and execution of python code making pyexpander Turing complete.|
|PP||2016||PP is a text preprocessor designed for Pandoc (and more generally Markdown and reStructuredText). PP implements: Macros, literate programming, GraphViz, PlantUML and ditaa diagrams, Bash, Cmd, PowerShell, Python and Haskell scripts.|
|XPOP||XPOP was another attempt at a general macro processing language by Mark Halpern at IBM in the 1960s.|
|M4||1977||m4 was designed for Unix by Brian Kernighan and Dennis Ritchie.|
|minimac||minimac is a minimalist general purpose macro processor. It operates as a character stream filter, recursively expanding macros as they are encountered. It is unusual for a macro processor in that it uses an explicit argument stack, and user functions are defined by concatenation (similar to the Forth language).|
|SNOBOL||1960s||SNOBOL is a string processing language which is capable of doing most of the pre-processing which can be done by a macro processor.|
|ELENA||Software: Practice and Experience, Vol. 14, pp. 519–531, Jun. 1984|
- Strachey, Christopher (October 1965). "A General Purpose Macrogenerator". Computer Journal. 8 (3): 225–241. doi:10.1093/comjnl/8.3.225.
- "aa_macro". Retrieved 2017-11-24.
- "wtfm". Retrieved 2017-11-24.
- Waite, William M. (July 1970). "The mobile programming system: STAGE2". Communications of the ACM. New York, NY, USA: ACM. 13 (7): 415–421. doi:10.1145/362686.362691.
- Farber, D. J., 635 Assembly System - GAP. Bell Telephone Laboratories Computation Center (1964).
- "Gema". gema.sourceforge.net. Retrieved 2017-04-21.
- "GPP". logological.org/gpp. Retrieved April 21, 2017.
- "Welcome to pyexpander's documentation! — pyexpander 1.7.0 documentation". pyexpander.sourceforge.net. Retrieved 2017-04-21.
- "akiwi - Text Assembler". www.akiwi.co.uk. Retrieved 2017-04-21.
- Delord, Christophe. "PP - A generic Preprocessor (with Pandoc in mind)". cdsoft.fr. Retrieved 2017-10-17.
- "minimac". freshmeat.net. Retrieved 2017-04-21.