实现JavaScript语言解释器(二)

本文是实现JavaScript解释器系列的第二部分,主要讲解语法解析的概念和过程。首先介绍了Simple语言的语法,然后阐述了BNF(巴克斯范式)在定义编程语言语法规则中的作用。接着,作者探讨了如何通过内部DSL设计和实现Simple语言的语法解析,包括DSL的定义、分类,以及在TypeScript中创建用于语法解析的DSL。最后,展示了如何生成抽象语法树(AST)并总结了文章内容。
摘要由CSDN通过智能技术生成

前言

在上一篇文章中我为大家介绍了Simpe项目的一些背景知识以及如何使用有限状态机来实现词法解析,在本篇文章中我将会为大家介绍语法分析的相关内容,并且通过设计一门内部DSL语言来实现Simple语言的语法解析。

什么是语法解析

词法解析过后,字符串的代码会被解析生成一系列Token串,例如下面是代码let a = 'HelloWorld';的词法解析输出:

[
  {
   
    "type": "LET",
    "value": "let",
    "range": {
   
      "start": {
   
        "line": 1,
        "column": 1
      },
      "end": {
   
        "line": 1,
        "column": 3
      }
    }
  },
  {
   
    "type": "IDENTIFIER",
    "value": "a",
    "range": {
   
      "start": {
   
        "line": 1,
        "column": 5
      },
      "end": {
   
        "line": 1,
        "column": 5
      }
    }
  },
  {
   
    "type": "ASSIGN",
    "value": "=",
    "range": {
   
      "start": {
   
        "line": 1,
        "column": 7
      },
      "end": {
   
        "line": 1,
        "column": 7
      }
    }
  },
  {
   
    "type": "STRING_LITERAL",
    "value": "'HelloWorld'",
    "range": {
   
      "start": {
   
        "line": 1,
        "column": 9
      },
      "end": {
   
        "line": 1,
        "column": 20
      }
    }
  },
  {
   
    "type": "SEMICOLON",
    "value": ";",
    "range": {
   
      "start": {
   
        "line": 1,
        "column": 21
      },
      "end": {
   
        "line": 1,
        "column": 21
      }
    }
  }
]

语法解析(Syntax Analysis)阶段,Simple解释器会根据定义的语法规则来分析单词之间的组合关系,从而输出一棵抽象语法树Abstract Syntax Tree),这也就我们常听到的AST了。那么为什么说这棵语法树是抽象的呢?这是因为在语法解析阶段一些诸如分号和左右括号等用来组织代码用的token会被去掉,因此生成的语法树没有包含词法解析阶段生成的所有token信息,所以它是抽象的。在语法解析阶段,如果Simple解释器发现输入的Token字符串不能通过既定的语法规则来解析,就会抛出一个语法错误(Syntax Error),例如赋值语句没有右表达式的时候就会抛出Syntax Error

从上面的描述可以看出,词法解析阶段的重点是分离单词,而语法解析阶段最重要的是根据既定的语法规则组合单词。那么对于Simple解释器来说,它的语法规则又是什么呢?

Simple语言的语法

我们前面说到Simple语言其实是JavaScript的一个子集,所以Simple的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值