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