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

标签 rust language-lawyer grammar chomsky-hierarchy

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

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

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


相关:Is Rust's lexical grammar regular, context-free or context-sensitive?

最佳答案

Rust 包含一个宏处理器,其操作对上下文高度敏感。

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

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

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

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

关于rust - Rust 的句法语法是上下文无关的还是上下文敏感的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43677722/

相关文章:

loops - Rust:迭代 iter() 或向量本身

c++ - 编译器降低程序的时间复杂度是否合法?这被认为是可观察的行为吗?

c++ - C++ 翻译单元的语法

rust - 在Rust中中断std::io::read()

rust - 负载测试后,每个新的 mio 连接都会立即挂断

c - 是否可以在不违反严格别名的情况下使用字符数组作为内存池?

java - 明确指定通配符的上限时有区别吗?

parsing - 规范语法中的结构差异

python - 删除 *a : can't use starred expression here

rust - 有没有办法只在 rustdoc 验证示例时启用 Cargo 功能?