我试图为C标记编写一个词法分析器,为每个标记构建DFA并在C中模拟它们。目前我正在尝试识别字符串文字。根据定义,字符串文字是"
之间的字符。考虑以下程序:
#include<stdio.h>
int main()
{
char *a = "Hello "
"World";
printf("%s",a);
}
输出:
Hello World
所以现在我很困惑我是否应该将Hello
和World
视为单独的令牌或将Hello World
合并为一个令牌?谢谢 ! :)
答案 0 :(得分:2)
我写的评论
“Hello”和“World”是两个独立的令牌。这是一个词法分析考虑因素。当它们显示为连续的标记时,它们代表单个字符串文字的两个部分。这是一个语义考虑 - 即令牌的组合在C源代码中意味着什么。
根据传统的通用编译器构造描述了问题的视图。例如,区别在于lex
扫描程序定义中可能表示的内容与yacc
解析器描述中将要处理的内容之间的区别(以传统工具的形式表示)。
在实践中,C定义了一组更大,更详细的“翻译阶段”,用于从C源构建可执行程序(C99 5.1.1.2)。在C的特定流程模型中,"Hello"
和"World"
是单独的预处理令牌,在转换阶段3中标识。这些在转换阶段6连接成单个令牌。所有(剩余的)预处理标记在转换阶段7转换为直接标记。然后,生成的标记是语义分析的输入(也是第7阶段的一部分)。
C不要求实现根据给定的模型实际实现转换(编译),包括所有单独的阶段,而许多不需要。 C只要求最终结果就像实现根据模型行为一样。从这个意义上说,你的问题只能回答“它取决于”。然而,就推断的问题“什么是令牌”的非C特定概念化而言,我将保持我原始的,简短的描述提供了有用的心理模型。