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

Is Rust's syntactical grammar context-free or context-sensitive?

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

let x = ((((()))));

但是 Rust 的语法至少是上下文无关的吗?如果不是,什么元素使语法上下文敏感?或者语法甚至可以递归枚举,比如 C++'s syntactical grammar?


相关

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

您可以尝试通过只进行语法分析来解决这个问题,但不包括宏扩展——可能,但不是特别有用——或者假设宏扩展是由一些中间工具完成的给予免费通行证以使其成为图灵完备。

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

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

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

直接从 Rust 的源代码中回答:

Rust's lexical grammar is not context-free. Raw string literals are the source of the problem. Informally, a raw string literal is an r, followed by N hashes (where N can be zero), a quote, any characters, then a quote followed by N hashes. Critically, once inside the first pair of quotes, another quote cannot be followed by N consecutive hashes. e.g. r###""###"### is invalid.