前言
在上一篇文章中我为大家介绍了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的