预处理器

在计算机科学中，预处理器（）是程序中处理输入数据，产生能用来输入到其他程序的数据的程序。输出被称为输入数据预处理过的形式，常用在之后的程序比如编译器中。所作处理的数量和种类依赖于预处理器的类型，一些预处理器只能够执行相对简单的文本替换和巨集展开，而另一些则有着完全成熟的编程语言的能力。

一个来自计算机编程的常见的例子是在进行下一步编译之前，对源代码执行处理。在一些计算机语言（例如：C语言）中有一个叫做预处理的翻译阶段。

词法预处理器
词法预处理器是最低级的预处理器，因为它们只需要词法分析，也就是说，它们在语法分析处理之前，根据用户定义的规则，进行简单的词法单元替换。典型的词法预处理器产生宏替换，包含其他文件的文本，并且条件性地编译或者包含文件。

C预处理器
最常见的例子是C预处理器，采用以'#'为行首的指示。因为它不知道底层语言，它的使用被批评并且它的许多功能被其它语言直接内建。例如，巨集替换被显式内联和模板替代，包含变为编译期导入（compile-time import，这需要在目标代码中预先保存类型信息，使这个功能无法改进一个语言）；条件编译被if-then-else和死代码消除替代。

其他预处理器
其他词法预处理器包括一般用途的m4，最常用的跨平台构建系统，比如autoconf，和开源的巨集处理器GEMA，操作上下文模式。

句法预处理器
句法预处理器是由Lisp家族语言引进的。它们的作用是根据若干用户定义的规则转换语法树。对于某些程序语言，这些规则是使用同一种语言来写的（compile-time reflection）。这就是Lisp和OCaml的情况。某些程式語言依靠一個完全的外部語言來定義轉換，例如XSLT處理器處理XML的方式，或與靜態類型的對應語言CDuse。

靜態處理器常被用來自定程式語言的語法，並透過增加新的primitives或嵌入特定領域語言到一般用途的語言裡來擴充。

自定義語法
關於自定義語法的一個好例子是在OCaml程式語言裡兩個不同語法的存在。程式可能平常地由「正常語法」或「校正過的語法」寫成，並且按需求由兩者之一進行程式優化

類似地，一些OCaml語言寫成的程式藉由新運算符的增加來自定化語言的語法。

擴充語言
對於從巨集擴充語言最好的範例可在LISP語言家族裡找到。這種語言本身就是簡單的動態類型核心模塊，Scheme或Common Lisp的標準分配允許了命令或物件導向的程式編輯，靜態類型亦如此。幾乎所有這些特性都由語法預處理執行，雖然它的「巨集擴充」編譯階段由LISP的編譯器處理這點很值得一提就是。這仍然可以視為預處理的一種形式，因為它在編譯階段前就進行了。

類似地，靜態檢查、類型安全正規表式或代碼生成可能透過巨集被加入到OCaml的語法和語義裡，如同微線程（亦稱為協程或纖程）、單子或透明的XML操作。

語言專門化

作為模板引擎的預處理器
任何「一般目的預處理器」，例如M4，都可以當成模版引擎（template engine）使用。

参考文献

外部链接
 DSL Design in Lisp
 Programming from the bottom up 
 The Generic PreProcessor 
 Gema, the General Purpose Macro Processor 
 The PIKT piktc  text, script, and configuration file preprocessor 
 minimac, a minimalist macro processor 
 Java Comment Preprocessor 

程序设计语言