翻译:Complete macro expansion algorithm 完整的宏展开算法

原文

https://www.spinellis.gr/blog/20060626/cpp.algo.pdf

对照翻译

翻译:Complete macro expansion algorithm 完整的宏展开算法_第1张图片
这是一个符合标准要求的完整的宏展开实现。它为标准宏展开过程中目前未指定的两个部分定义了行为。请放心,这两个部分只有在展开过程被滥用(不同的隐藏集合相互混合)时才会起作用,因此对“真实”程序没有任何影响。

命名约定:所有大写名称都是变量,变量值的绑定发生在调用和条件语句中。TS是“标记序列”;T是“标记”;HS是“隐藏集合”;撇号用于区分这些的不同实例。一个标记及其隐藏集合被指定为“T HS”。最初,每个标记都有一个空的隐藏集合。操作符“•”用于分隔列表的元素(或一个元素与序列的其余部分)。

expand(TS ) /* 递归,替换,推回,重新扫描 */

翻译:Complete macro expansion algorithm 完整的宏展开算法_第2张图片
整个程序的文本作为一个标记序列将被传递给expand,它使用单个标记序列参数TS进行调用。首先,如果TS为空集合,则结果为空集合。
否则,如果标记序列以一个其隐藏集包含该标记的标记开头,则结果是以该标记(包括其隐藏集)开头的标记序列,后跟对其余标记序列调用expand的结果。
否则,如果标记序列以对象型宏开头,则结果是以由替换标记序列为宏,两个空集合,宏的隐藏集和宏本身的并集,以及一个空集合调用subst返回的序列开头的标记序列的展开结果。
否则,如果标记序列以函数型宏和一个左括号开头,则首先验证在可能为空的实参标记序列后,是否有一个右括号。如果是这样,结果是以由替换标记序列为宏,宏的形式参数,实参标记序列,宏的隐藏集与右括号的隐藏集的交集并与宏本身的并集以及一个空集合调用subst返回的序列开头的标记序列的展开结果。
否则,标记序列必须是其他标记。结果是标记(包括其隐藏集)开头的标记序列的展开结果,后跟其余标记序列的展开结果。
上面的交集操作以及下面的粘合函数中的交集操作都是草案未指定的一种可能的实现选择。该算法选择了交集操作,因为它提供了最大量的宏替换,但仍然不会导致无限循环等问题。

翻译:Complete macro expansion algorithm 完整的宏展开算法_第3张图片
subst(IS,FP,AP,HS,OS ) /* substitute args, handle stringize and paste /
subst(IS,FP,AP,HS,OS ) /
替换参数,处理字符串化和粘贴 */

翻译:Complete macro expansion algorithm 完整的宏展开算法_第4张图片
subst的简要概述是,它通过处理来自左到右的每个标记,从输入序列IS构建输出序列OS。(此操作所采取的顺序也由实现决定,从左到右的遍历更自然,因为算法的其余部分受到此顺序的限制。)字符串化很容易,粘贴则需要更复杂的处理,因为该操作有许多组合。在整个输入序列完成后,更新的隐藏集合应用于输出序列,这就是subst的结果。

翻译:Complete macro expansion algorithm 完整的宏展开算法_第5张图片
glue(LS,RS ) /* 将左侧的最后一个与右侧的第一个粘合 /
hsadd(HS,TS ) /
添加到标记序列的隐藏集合 */
剩余的支持函数包括:
ts(T ):给定一个宏名称标记,ts返回宏定义的替换标记序列。
fp(T ):给定一个宏名称标记,fp返回宏定义的(有序的)形式参数列表。
select(i,TS ):给定一个标记序列和一个索引i,select使用原始标记序列中的逗号标记(不在嵌套括号对之间)作为分隔符,返回第i个标记序列。
stringize(TS ):给定一个标记序列,stringize返回一个包含各个标记拼接的单个字符串文字标记。

以上是tcc中也引用的宏展开算法。用于c编译器。
暂时翻译备用。

你可能感兴趣的:(算法,学习)