ECMAScript:Lexical Grammar vs Syntactic Grammar

时间:2018-04-06 14:49:01

标签: parsing ecmascript-6 ecmascript-2017 ecma

我在理解ECMAScript 2017规范中Lexical GrammarSyntactic Grammar之间的具体差异时遇到了一些困难。

摘自ECMAScript 2017

5.1.2 Lexical和RegExp Grammars

  

ECMAScript的词汇语法在第11节中给出。这个语法   具有符合的终端符号Unicode代码点   10.1中定义的SourceCharacter规则。它定义了一组   制作,从目标符号InputElementDiv开始,   InputElementTemplateTail,或InputElementRegExp,或   InputElementRegExpOrTemplateTail,描述如何序列   代码点被转换为一系列输入元素

     

除了空格和注释之外的输入元素构成终端   ECMAScript语法语法的符号被称为   ECMAScript令牌。这些令牌是保留字,标识符,   文字和ECMAScript语言的标点符号。

5.1.4语法语法

  

当要将代码点流解析为ECMAScript脚本时   或模块,它首先被转换为输入元素流   重复应用词汇语法;这个输入流   然后,单个元素应用程序解析元素   语法。

问题

  1. 词汇语法
    • 这里说终端符号是Unicode代码点(个别字符)
    • 它还说它产生输入元素(aka。令牌)
    • 这些如何可以调和?终端符号是令牌,因此它产生令牌。或者,终端符号是单独的代码点,这就是它产生的代码点。
  2. 句法语法
    • 我对这个语法和词汇语法有相同的问题
    • 似乎这里的终端符号是标记
    • 因此,通过应用语法语法规则,可以生成有效的令牌,然后可以将其发送给解析器?或者,这个语法是否接受令牌作为输入,然后测试整个令牌流的有效性?
  3. 我最好的猜测

    1. Lexing阶段
      • 输入:代码点(源代码)
      • 输出:应用词汇语法制作以生成有效标记(词汇类型+值)作为输出
    2. 解析阶段
      • 输入:代币
      • 输出:应用语法语法产生(CFG)来决定所有令牌是否一起表示有效流(即源代码作为一个整体是有效的Script / {{ 1}})

2 个答案:

答案 0 :(得分:2)

我认为你对terminal symbol的含义感到困惑。实际上它们是解析器的输入,而不是输出(这是一个解析树 - 包括列表的退化情况)。

另一方面,生产规则确实有终端符号作为输出,目标符号作为输入 - 它是向后的,这就是术语“终端”的来源。非终端可以扩展(以不同的方式,这是规则所描述的)到一系列终端符号。

示例:

Language:
   S -> T | S '_' T
   T -> D | T D
   D -> '0' | '1' | '2' | … | '9'

String:
   12_45

Production:
     S          // start: the goal
   = S '_' T
   = T '_' T
   = T D ' ' T
   = T '2 ' T
   = D '2 ' T
   = '12 ' T
   = '12 ' T D
   = '12 ' T '5'
   = '12 ' D '5'
   = '12_45'     // end: the terminals

Parse tree:
   S
    S
     T
      T
       D
        '1'
      D
       '2'
    ' '
    T
     T
      D
       '4'
     D
      '5'

Parser output (generating a sequence of items from top-level Ts):
   '12'
   '45'

所以

  • lexing阶段将代码点作为输入,将令牌作为输出。代码点是词汇语法的终结符号。
  • 句法阶段将令牌作为输入和程序作为输出。标记是句法语法的终结符号。

答案 1 :(得分:1)

你最好的猜测"对于第一个近似是正确的。主要的修正是改变标记"到"输入元素"。也就是说,词汇级别产生输入元素(其中只有一些被指定为#39;令牌'),语法级别将输入元素作为输入。

语法级别几乎忽略不是令牌的输入元素,除了自动分号插入规则要求它注意空格和注释中的行终止符。

你的"这些如何可以调和?"问题似乎源于对"终端符号"的误解。或"产生",但我不清楚哪个。