他们之间有空格的字符串

时间:2015-10-02 17:21:59

标签: c string compiler-construction

我试图为C标记编写一个词法分析器,为每个标记构建DFA并在C中模拟它们。目前我正在尝试识别字符串文字。根据定义,字符串文字是"之间的字符。考虑以下程序:

#include<stdio.h>
int main()
{
    char *a = "Hello "


    "World";
    printf("%s",a);
}

输出:

Hello World

所以现在我很困惑我是否应该将HelloWorld视为单独的令牌或将Hello World合并为一个令牌?谢谢 ! :)

1 个答案:

答案 0 :(得分:2)

我写的评论

  

“Hello”和“World”是两个独立的令牌。这是一个词法分析考虑因素。当它们显示为连续的标记时,它们代表单个字符串文字的两个部分。这是一个语义考虑 - 即令牌的组合在C源代码中意味着什么。

根据传统的通用编译器构造描述了问题的视图。例如,区别在于lex扫描程序定义中可能表示的内容与yacc解析器描述中将要处理的内容之间的区别(以传统工具的形式表示)。

在实践中,C定义了一组更大,更详细的“翻译阶段”,用于从C源构建可执行程序(C99 5.1.1.2)。在C的特定流程模型中,"Hello""World"是单独的预处理令牌,在转换阶段3中标识。这些在转换阶段6连接成单个令牌。所有(剩余的)预处理标记在转换阶段7转换为直接标记。然后,生成的标记是语义分析的输入(也是第7阶段的一部分)。

C不要求实现根据给定的模型实际实现转换(编译),包括所有单独的阶段,而许多不需要。 C只要求最终结果就像实现根据模型行为一样。从这个意义上说,你的问题只能回答“它取决于”。然而,就推断的问题“什么是令牌”的非C特定概念化而言,我将保持我原始的,简短的描述提供了有用的心理模型。