Rust 的句法语法是上下文无关的还是上下文相关的?

Luk*_*odt 6 grammar language-lawyer rust chomsky-hierarchy

几乎没有任何编程语言的句法语法是规则的,因为它们允许任意深度嵌套的括号。Rust 也这样做:

let x = ((((()))));
Run Code Online (Sandbox Code Playgroud)

但 Rust 的句法语法至少是上下文无关的吗?如果不是,什么元素使语法与上下文相关?或者语法甚至是递归可枚举的,就像C++ 的句法语法一样?


相关Rust 的词法语法是规则的、上下文无关的还是上下文相关的?

ric*_*ici 6

Rust 包含一个宏处理器,其操作是高度上下文相关的。

您可以尝试通过仅进行语法分析来解决此问题,但不包括宏扩展(可能,但不是特别有用),或者假设宏扩展是由某些中间工具完成的,该中间工具可以免费通过让它成为图灵完备的。

但我倾向于说,这仅仅意味着 Rust 语言是递归可枚举的。

宏定义的有效性存在许多限制,这些限制可能使语言(至少)对上下文敏感,即使您决定不将宏扩展作为句法分析的一部分执行。

这并不意味着上下文无关语法不能作为 Rust 语法分析的一部分。这可能是必要的,甚至使用解析器生成器(例如 bison 或 Antlr)(并且两者都有示例)可能很有用。与大多数编程语言一样,Rust 有一个简单的超集,它是上下文无关的,并且可以使用上下文无关语法工具进行有用的分析;然而,最终有些文本需要在编译时被视为无效而被拒绝,即使它们是 CF 超集的一部分。