【问题标题】:Can Table-Driven Lexers "lex" Multi-Dimensional Arrays?表驱动的词法分析器可以“lex”多维数组吗?
【发布时间】:2020-05-12 19:24:24
【问题描述】:

我一直在考虑如何实现这一点,但我没有找到真正好的答案。

本质上,我遇到的问题是,给定一个任意大的数组维度,必须有相同数量的 Lexer 状态来跟踪深度,所以这让我开始思考如何表达表-Driven Lexers 真的可以。

对我来说,很明显 DFA 不能计数。那么既然 DFA(离散有限自动机)不能计数,至少不能超出硬编码的限制,那么 TDL 如何支持多维数组呢?

语言是否对您可以拥有多少嵌套数组有硬性限制,或者他们是否使用手工制作的 Lexers 来解决计数的需要?

【问题讨论】:

  • 根据我的经验,词法分析器 - 甚至解析器 - 不算数 - 它们依赖于以下语义分析阶段来检查所有(在这种情况下)数组边界是否有效。
  • @500-InternalServerError 当人们说“DFA 无法计数”时,他们通常是在谈论他们无法表达匹配括号之类的条件(即计算当前打开的括号的数量)。当然,解析器确实做到了这一点。我认为 OP 不是在谈论检查数组边界(或者我严重误解了这个问题)。
  • 你为什么只用词法分析器来做这个?对您而言,“词法分析”一词是什么意思?
  • @rici 对我来说,词法分析器只是从纯文本中吐出一系列标记。标记是一对、语法实体及其值。
  • @novicegrammer:没错。因此,它不是组装像数组这样的复杂对象的工具。你不需要知道数组元素的索引就知道42是什么类型的令牌。

标签: compiler-construction lexer dfa


【解决方案1】:

我假设当您谈论 lexing 数组时,您是在谈论像 [x, y] 这样的数组字面量或像 {x, y} 这样的数组初始值设定项。这些都不会作为一个单一的标记来使用。它们的词法分别为[x,y]{x,y}。这适用于多维数组以及一维数组。

请注意,如果您尝试将它们转换为单个标记,即使使用一维数组也会遇到问题。由于它们通常可以包含任意表达式,将它们识别为单个标记意味着词法分析器必须解析任意异常,这也涉及任意嵌套,并且显然超出了词法分析器的范围。

【讨论】:

  • 我暗示的是 char x[][][] 等。我猜词法分析然后解析数组文字,而不是数组标识符也会导致同样的问题。
  • @Novicegrammer:如果您担心的是声明的数组大小与初始化器的大小和形状之间的一致性,那么解析器不会拒绝错误的程序是正确的。所以呢?有很多错误的程序是语法不会拒绝的。 (例如,使用未初始化的变量。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 2011-06-15
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多