C 有向图是否由编译器转换,三向图是否由预处理器转换?
我试图理解三角图和有向图,而不是使用它们 我已经阅读并理解:C 有向图是否由编译器转换,三向图是否由预处理器转换?,c,compilation,c-preprocessor,digraphs,trigraphs,C,Compilation,C Preprocessor,Digraphs,Trigraphs,我试图理解三角图和有向图,而不是使用它们 我已经阅读并理解: 在实际编译开始之前,应始终由预处理器将三角图转换为相应字符 编译器应将有向图转换为相应的字符 这是真的吗?有向图不会“转换为相应的字符”。字符串文字”有向图不会“转换为相应的字符”。在编译过程的第一阶段,字符串文字“三向图序列确实会被相应的字符替换,在预处理器之前,lexer分析字符流以生成预处理器标记 下一个阶段处理转义的换行符,即:\的实例紧接着一个换行符,该换行符从字符流中删除。请注意,\可以在第一阶段生成,作为??/tri
- 在实际编译开始之前,应始终由预处理器将三角图转换为相应字符
- 编译器应将有向图转换为相应的字符
这是真的吗?有向图不会“转换为相应的字符”。字符串文字
”有向图不会“转换为相应的字符”。在编译过程的第一阶段,字符串文字“三向图序列确实会被相应的字符替换,在预处理器之前,lexer分析字符流以生成预处理器标记
下一个阶段处理转义的换行符,即:\
的实例紧接着一个换行符,该换行符从字符流中删除。请注意,\
可以在第一阶段生成,作为??/
trigraph的替代品
然后,词法分析器分析字符流以产生预处理标记,例如[
,并且在编译过程的第一阶段,在预处理器词法分析器分析字符流以产生预处理器标记之前,Trigraph序列确实被相应的字符替换
下一个阶段处理转义的换行符,即:\
的实例紧接着一个换行符,该换行符从字符流中删除。请注意,\
可以由第一阶段生成,以替换??/
trigraph
lexer然后分析字符流以产生预处理标记,例如[
,第一阶段是词法分析。它是编译的一部分。@Pău Jău那么trigraph和digraph都发生在第一阶段编译之前?@Cătălinaîrbu我很高兴你找到了答案。-)第一阶段是词法分析。它是编译的一部分。@Pău Jău那么trigraph和digraph都发生在第一阶段编译之前@Cătălinaîrbu我很高兴你找到了答案。-)关于阶段顺序的有趣之处在于,行延续中的\
最初可能被键入为??/
,这进一步使用正则表达式分解C的尝试复杂化。幸运的是,C标准中这些神秘的角落进展缓慢但肯定被删除。@rici:我更新了答案以回应你的评论。关于阶段顺序的有趣之处在于,行继续符中的\
最初可能被键入为??/
,这进一步使用正则表达式分解C的尝试变得复杂。幸运的是,C标准中这些神秘的角落正在慢慢消失但肯定是被删除了。@rici:我更新了答案以回应你的评论。
chqrlie $ make lexing && ./lexing
clang -O3 -funsigned-char -std=c11 -Weverything -Wwrite-strings -lm -o lexing lexing.c
lexing.c:8:14: warning: trigraph converted to '|' character [-Wtrigraphs]
puts(STR(??!));
^
lexing.c:9:15: warning: trigraph converted to '|' character [-Wtrigraphs]
puts(STR('??!'));
^
lexing.c:10:15: warning: trigraph converted to '|' character [-Wtrigraphs]
puts(STR("??!"));
^
lexing.c:18:15: warning: trigraph converted to '\' character [-Wtrigraphs]
puts(STR(<??/
^
4 warnings generated.
|
'|'
"|"
<:
'<:'
"<:"
<:
<:
'<:'
"<:"
glue(<,:)
<: