Sin*_*kus 1 c syntax grammar declaration c89
ANSI C语法指定:
declarator:
pointer_opt direct-declarator
direct-declarator:
identifier
( declarator )
direct-declarator [ constant-expression_opt ]
direct-declarator ( parameter-type-list )
direct-declarator ( identifier-list_opt )
Run Code Online (Sandbox Code Playgroud)
根据这个语法,可以推导出来
func()()
Run Code Online (Sandbox Code Playgroud)
作为宣告者,和
int func()()
Run Code Online (Sandbox Code Playgroud)
作为声明,在语义上是非法的.为什么C语法允许这种语法上合法但非法的非法声明?
这些问题通常无法肯定回答,因为你在1989年要求提供关于C委员会的集体思想和审议的信息.他们从来没有完全在公共领域开展语言开发工作,比如负责Python的人,三十年前他们做得更少.如果你亲自调查他们,他们可能不会记得.
我们可以查看C Rationale文档(我链接到对应于C1999的版本,但据我所知它自1989年以来没有太大变化)的线索,但是快速浏览,我看不到与您的问题相关的任何事情
这使我根据编程语言设计的一般原则进行猜测.还有就是有关你的问题的一般原则:特别是对于较旧的语言,设计师尽量让正规的语法是上下文尽可能多地.这使得编写有效的解析器变得更加容易.像"你不能拥有一个返回函数的函数"这样的规则需要上下文,因此它们被排除在语法之外.将它们作为应用于解析树的事后约束来处理它们是直截了当的,这就是设计师所做的.
C语法有很多地方可以使用这个原则,而不仅仅是你要问的那个.例如,存在用于标记化的"最大munch"规则,因为它意味着标记化器不需要知道完整的解析器上下文,即使它导致不方便的结果,例如a-----b被解释为a -- -- - b代替a -- - -- b,即使解析器将拒绝前者但接受后者.
这种编程语言的设计原则通常让初学者感到惊讶,因为它与人类理解自然语言的方式有很大的不同.即使是最无意义的句子,我们也会尽力"修复"某种上下文适当的含义,我们实际上在谈话中依赖于这种含义.可能有助于考虑更糟糕更好的元原则(过度简化,因为你可以快速完成前90%的工作并将其放在那里,然后迭代剩余的90%).