gpt4 book ai didi

c - 不包括限定词重复的语法

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:09 25 4
gpt4 key购买 nike

我目前正在通读 Compiler Design in C.我不太熟悉语法的概念,但第一个练习要求我编写一个识别 C 变量声明的语法。

我的问题是,我将如何防止(在语法中)重复签名和未签名?我对产品的熟悉程度(如书所教)在左侧有一个非终结符,指向最多两个终结符/非终结符。我只是不确定如何使用该语言来“查看”是否已经使用了另一个符号。!

到目前为止我的语法是:

Declaration -> Attributes Identifier  
Attributes -> Prefix Type
Prefix ->

有没有比“qualifier > unsigned long | signed long | unsigned”等更简洁的方式?当您包括所有可能的组合时,它会变得很长,而且即使这样也不会作为前缀出现,因为可以将限定符放在任何地方。

最佳答案

您可以通过编写不允许重复的语法规则的组合枚举集来防止重复。您可以对非常小的可选或无序项目(如“已签名”和“未签名”)执行此操作,有点实际。

这不值得麻烦。

您还可以考虑编写语法以防止给定的变量声明在同一范围内出现两次。这本质上是同一个问题,但应该很清楚,仅靠大量的语法规则来解决这个问题是没有希望的。

问题是大多数语言都是上下文相关的,例如,您可以在一个地方写什么,取决于您在其他地方写什么,也许在源文本中很远。 (你的 signed 和 unsigned 问题“很远”只有 1 个 token 那么小)。但是我们的语法形式主义主要用于上下文无关(事实上,对于许多解析器生成器,甚至更少,例如 LL 或 LALR)语言。因此,它们的表现力不足以描述所有一种语言对您编写的文本的限制。

有一个标准的治疗方法。您编写了一个接受“太多”的语法,并实现了一个程序化的后解析过程来检查额外的约束。由于“过程”部分通常是用传统编程语言实现的,因此它具有强大的图灵功能,因此您始终可以通过代码检查上下文敏感性(如果可能的话)。

要进行解析后传递,您的解析器必须记住它看到的内容。因此,您需要解析捕获,通常使用抽象语法树完成。检查范围内名称的有效性需要您有符号表。验证 Java 程序的各个部分是否始终可达至少需要简单的流分析。

底线:简单地编写语法。不要担心这样的重复;解析后很容易检查。通过解析位;这是问题中最简单的部分。准备好添加更多的机制以使语法处理变得实用。大多数人似乎不明白这一点。 (查看我的简历以了解“解析后的生活”的讨论)。

关于c - 不包括限定词重复的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29161389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com