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

ECMAScript 2017 Lexical Grammar与Syntactic Grammar差异技术咨询

搞懂ES2017中Lexical Grammar和Syntactic Grammar的差异

我当初啃ES2017规范的时候也在这俩概念上卡了好久,结合你贴的规范内容,给你掰扯清楚核心区别:

1. 先明确各自定位:一个拆积木,一个搭积木

Lexical Grammar(词法语法)

这是源码解析的第一阶段,负责把原始的Unicode源码字符(就是规范里说的SourceCharacter)拆分成一个个最小的、有意义的“词法单元”(tokens)——比如关键字const、标识符num、数字42、运算符+、字符串'foo'这些。

规范里提到的InputElementDiv、InputElementTemplate这些,其实是词法语法的上下文敏感入口:因为有些字符序列在不同的句法环境下会被解析成不同的token。比如/这个符号,在x / 2里是除法运算符,但在if (x) /foo/.test(y)里是正则表达式的开头。词法语法会根据当前的句法上下文,选择对应的InputElement规则来生成正确的token。

Syntactic Grammar(句法语法)

这是解析的第二阶段,它的“原材料”是词法语法生成的tokens,负责把这些tokens按照规则组合成合法的ECMAScript语法结构——比如变量声明、条件语句、函数定义、表达式等等。

比如拿到const、num、=、42、+、'foo'这些tokens后,句法语法会识别出这是一个合法的变量声明语句;但如果tokens是const、=、num、42,它就会抛出语法错误,因为不符合变量声明的结构规则。

2. 核心差异对比

  • 处理对象不同:词法语法处理原始的Unicode码点字符;句法语法处理词法单元(tokens)。
  • 终结符不同:词法语法的终结符是SourceCharacter(单个Unicode码点);句法语法的终结符是词法语法生成的各种tokens。
  • 目标产物不同:词法语法输出的是一个个独立的tokens;句法语法输出的是完整的语法结构(比如Program、Statement、Expression)。
  • 上下文敏感性的作用场景不同:词法语法的上下文敏感是为了消除字符的歧义(比如区分/是除法还是正则);句法语法的上下文敏感是为了验证结构的合法性(比如await只能在async函数里使用)。

结合你贴的规范内容再补一句

ECMAScript的Lexical Grammar定义在第11章,其终结符为符合10.1节SourceCharacter规则的Unicode码点,它定义了一组以InputElementDiv、InputElementTemplate等为目标符号的产生式...

这里的InputElementDiv等目标符号,本质是词法语法为了适配不同句法上下文而设计的“解析入口”——比如在允许除法的上下文里用InputElementDiv,在模板字符串里用InputElementTemplate,确保生成的tokens能被句法语法正确识别。

内容的提问来源于stack exchange,提问作者Magnus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:29:42