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

时间:2017-04-28 10:13:14

标签: 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?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:1)

直接从Rust的源代码中获取答案:

  

Rust的词法语法不是上下文无关的。原始字符串文字是   问题的根源。非正式地,原始字符串文字是r,   后跟N个散列(其中N可以为零),引号,任意字符,   然后是引号,后跟N个散列。至关重要的是,一旦进入第一个   一对引号,另一个引号后不能连续N个   哈希。例如r ###“” ###“ ###无效。