You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于ECMAScript参数化产生式右侧非终结符等价写法的疑问

ECMAScript 5.1参数化产生式等价写法的疑问解答

先理清ECMAScript规范里参数化产生式的核心逻辑:当产生式右侧的非终结符带参数(比如ExpressionStatement[+In]),它不是同时引用该非终结符的无参数版本和带参数版本,而是精准指向这个非终结符被参数化后的特定变体。

原示例的等价关系

示例1的写法:

StatementList :
    ReturnStatement
    ExpressionStatement[+In]

这里的ExpressionStatement[+In]特指带有+In约束的ExpressionStatement变体,规范里直接把这个变体命名为ExpressionStatement_In,也就是示例2的写法——这两者完全等价,都表示StatementList只包含ReturnStatement和受+In约束的表达式语句。

为什么不需要改成示例3?

示例3额外加入了无参数的ExpressionStatement,这彻底改变了原产生式的语义:

  • 原示例1/2的StatementList只允许两种语句:ReturnStatement和受+In约束的表达式语句
  • 示例3的StatementList则允许三种语句,多了一个无任何约束的表达式语句,这和原规范定义的规则完全不一致。

要区分两种参数化场景:只有当产生式左侧的非终结符被参数化时,才会衍生出该非终结符的多个变体(比如左侧定义ExpressionStatement[In]时,会生成无参数的ExpressionStatement和带参数的ExpressionStatement_In);但当右侧引用带参数的非终结符时,只是直接调用已定义的特定变体,不会自动包含无参数版本。

内容的提问来源于stack exchange,提问作者Vlad from Moscow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:27:35