【问题标题】:strings with space between them字符串之间有空格
【发布时间】:2015-10-02 17:21:59
【问题描述】:

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

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


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

输出:

Hello World

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

【问题讨论】:

  • 如果空格多于一个,编译器会忽略
  • 如果它们之间只有白色字符,则任何两个字符串文字将在编译时连接。
  • @Michi ,C 编译器是否将它们视为多个标记或单个标记?我假设预处理器在标记之前去除所有空格?
  • "Hello""World" 是两个独立的令牌。这是词法分析的考虑。当它们彼此相邻时,它们代表单个字符串文字的两个部分。这是语义上的考虑——即标记组合在 C 源代码中的含义。
  • @PruthviRaj,是的,这将是一个传统的编译器架构。

标签: c string compiler-construction


【解决方案1】:

在我写的 cmets 中

“Hello”和“World”是两个独立的标记。这是词法分析的考虑。当它们作为连续标记出现时,它们代表单个字符串文字的两个部分。这是语义上的考虑——即标记组合在 C 源代码中的含义。

这从传统的通用编译器构造的角度描述了问题的观点。例如,区别在于lex 扫描仪定义中可能表示的内容与yacc 解析器描述中可能处理的内容(按照传统工具的说法)。

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

C 不需要实现来根据给定模型实际实现翻译(编译),包括所有单独的阶段,很多都不需要。 C 只要求最终结果是 好像 实现按照模型行事。从这个意义上说,您的问题只能“视情况而定”回答。然而,就推断问题“什么是令牌”的非 C 特定概念化而言,我将坚持认为我最初的简短描述提供了一个有用的心理模型。

【讨论】:

  • 谢谢你,如果你能引用我指向你所指的transition phases 的链接会很有帮助,这样我可以继续阅读:)
  • @PruthviRaj,我引用了 (C99) 标准的相应部分。您可以在此处找到有关从何处获取参考文档的信息:stackoverflow.com/questions/81656/…
猜你喜欢
  • 2014-08-21
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 2013-09-17
相关资源
最近更新 更多