Parsing ECMAScript:词汇语法与句法语法

Parsing ECMAScript:词汇语法与句法语法,parsing,ecmascript-6,ecmascript-2017,ecma,Parsing,Ecmascript 6,Ecmascript 2017,Ecma,我很难理解规范中词汇语法和语法语法之间的具体区别 摘自ECMAScript 2017 5.1.2词法和RegExp语法 ECMAScript的词汇语法见第11条。这语法 其终端符号为符合 10.1中定义的SourceCharacter规则。它定义了一组 产品,从目标符号InputElementDiv开始, InputElementTemplateTail或InputElementRegExp,或 InputElementRegExportTemplateTail,它描述了这些 代码点被转换为一

我很难理解规范中
词汇语法
语法语法
之间的具体区别


摘自ECMAScript 2017 5.1.2词法和RegExp语法

ECMAScript的词汇语法见第11条。这语法 其终端符号为符合 10.1中定义的SourceCharacter规则。它定义了一组 产品,从目标符号InputElementDiv开始, InputElementTemplateTail或InputElementRegExp,或 InputElementRegExportTemplateTail,它描述了这些 代码点被转换为一系列输入元素

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

5.1.4句法语法

将代码点流解析为ECMAScript脚本时 或者模块,它首先由 词汇语法的反复运用;这个输入流 元素然后由语法的单个应用程序解析 语法


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

  • 我最好的猜测
  • 词法分析阶段
    • 输入:代码点(源代码)
    • 输出:应用词法语法生成以生成有效标记(词素类型+值)作为输出
  • 解析阶段
    • 输入:令牌
    • 输出:应用语法生成(CFG)确定所有标记是否一起表示有效流(即源代码作为一个整体是有效的
      脚本
      /
      模块

  • 我想你对这意味着什么感到困惑。事实上,它们是解析器的输入,而不是输出(这是一个解析树,包括列表的退化情况)

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

    例如:

    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'
    
    所以

    • 词法分析阶段将代码点作为输入,将标记作为输出。代码点是词汇语法的终端符号
    • 语法阶段将标记作为输入,程序作为输出。标记是句法语法的终端符号

      • 我想你不明白这是什么意思。事实上,它们是解析器的输入,而不是输出(这是一个解析树,包括列表的退化情况)

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

        例如:

        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'
        
        所以

        • 词法分析阶段将代码点作为输入,将标记作为输出。代码点是词汇语法的终端符号
        • 语法阶段将标记作为输入,程序作为输出。标记是句法语法的终端符号
          • 您的“最佳猜测”在一级近似值下是正确的。主要的修正是将“标记”改为“输入元素”。也就是说,词汇层产生输入元素(只有一些被指定为“标记”),而语法层将输入元素作为输入

            语法层几乎可以忽略不是标记的输入元素,除了自动分号插入规则要求它注意空格和注释中的行终止符

            你的“这些是如何调和的?”问题似乎源于对“终端符号”或“产品”的误解,但我不清楚哪个是正确的。

            你的“最佳猜测”在一级近似值下是正确的。主要的修正是将“标记”改为“输入元素”。也就是说,词汇层产生输入元素(只有一些被指定为“标记”),而语法层将输入元素作为输入

            语法层几乎可以忽略不是标记的输入元素,除了自动分号插入规则要求它注意空格和注释中的行终止符


            你的“这些是如何调和的?”问题似乎源于对“终端符号”或“产品”的误解,但我不清楚是哪一个。

            是的,谢谢Bergi,我已经理解了。在词法分析阶段,我假设我们反复应用词法语法,只生成一组终端符号。在词法分析阶段之后,它们代表什么?输出(即剩余的端子符号)现在是否为com