最佳答案
我知道 C 和 C + + 的语法是上下文相关的,尤其是 C 语言中需要一个“ lexer hack”。另一方面,我的印象是,尽管两种语言有很大的相似性,但是只需要两个 look-ahead 标记就可以解析 Java。
要使 C 更易于解析,您需要修改 C 的哪些内容?
我这样问是因为我看到的所有 C 语言上下文敏感性的例子在技术上都是允许的,但是非常奇怪,
foo (a);
可以使用参数 a
调用 void 函数 foo
。或者,它可以将 a
声明为 foo
类型的对象,但是您也可以很容易地去掉括号。部分原因是 C 语法的“直接声明器”生产规则实现了声明函数和变量的双重目的。
另一方面,Java 语法对于变量声明和函数声明有单独的生成规则
foo a;
那么您就知道它是一个变量声明,并且可以将 foo
明确地解析为一个类型名称。如果类 foo
没有在当前作用域中的某个地方定义,那么这可能不是有效的代码,但是这是可以在以后的编译器传递中执行的语义分析工作。
我看到有人说 C 很难解析,因为 typedef,但是你也可以在 Java 中声明你自己的类型。除了 direct_declarator
,还有哪些 C 语法规则是错误的?