几乎没有任何编程语言的句法语法是规则的,因为它们允许任意深度嵌套的括号。Rust 也可以:
let x = ((((()))));
但是,Rust 的句法语法至少是上下文无关的吗?如果不是,什么元素使语法上下文敏感?或者语法甚至可以递归枚举,就像C++ 的句法语法一样?
几乎没有任何编程语言的句法语法是规则的,因为它们允许任意深度嵌套的括号。Rust 也可以:
let x = ((((()))));
但是,Rust 的句法语法至少是上下文无关的吗?如果不是,什么元素使语法上下文敏感?或者语法甚至可以递归枚举,就像C++ 的句法语法一样?
Rust 包含一个宏处理器,它的操作是高度上下文敏感的。
您可以尝试通过只进行句法分析来解决这个问题,但不包括宏扩展——可能,但不是特别有用——或者假设宏扩展是由一些中间工具完成的,该工具可以免费通过让它成为图灵完备的。
但我倾向于说它只是意味着 Rust 语言是递归可枚举的。
宏定义的有效性有许多限制,这可能使语言(至少)对上下文敏感,即使您满足于不执行宏扩展作为句法分析的一部分。
这并不意味着上下文无关文法不能用作 Rust 句法分析的一部分。这可能是必不可少的,甚至可以使用诸如 bison 或 Antlr 之类的解析器生成器(并且存在两者的示例)。像大多数编程语言一样,Rust 有一个简单的超集,它是上下文无关的,可以使用上下文无关语法工具进行有用的分析;然而,最终有一些文本需要在编译时因为无效而被拒绝,即使它们是 CF 超集的一部分。
直接从Rust的源代码回答:
Rust 的词法语法不是上下文无关的。原始字符串文字是问题的根源。非正式地,原始字符串文字是一个 r,后跟 N 个哈希(其中 N 可以是零)、一个引号、任何字符,然后是一个引号,后跟 N 个哈希。至关重要的是,一旦在第一对引号内,另一个引号后面就不能有 N 个连续的哈希值。例如 r###""###"### 无效。