语法解析器首先就是构建我们的语法解析规则. 将我们通过词法解析获取的 Token 数据转换为一个语法树.
上图引用自: https://time.geekbang.org/column/article/119891
原理算法分析
语法规则
program: statement+;statement: intDeclaration | expressionStatement | assignmentStatement;intDeclaration : 'int' Identifier ( '=' additiveExpression)? ';';expressionStatement : additiveExpression ';';assignmentStatement : Identifier '=' additiveExpression ';';additiveExpression : multiplicativeExpression ( (+|-) multiplicativeExpression )*multiplicativeExpression: primaryExpression ( (* | /) primaryExpression)*primaryExpression : Identifier | IntLiteral | '(' additiveExpression ')';
- 程序由 一个或多个
**statement**组成. **statement**由**intDeclaration**(变量声明)**expressionStatement**(表达式语句) 或**assignmentStatement**(赋值语句) 组成 ,三者取其一.**intDeclaration**(变量声明)- int 开头
- 空格
**Identifier**类型的 Token- 之后可以有 = 和
**additiveExpression**(加法表达式) - 末尾为 分号
**expressionStatement**(表达式语句) 只有**additiveExpression**(加法表达式) + 末尾分号**assignmentStatement**(赋值语句)**Identifier**类型的 Token- =
**additiveExpression**(加法表达式)- 末尾为 分号
**additiveExpression**(加法表达式)- 一个
**multiplicativeExpression**(乘法表达式) - 加号或者减号
- 一个
**multiplicativeExpression**(乘法表达式) - b 和 c 可以匹配0次或者多次
- 一个
**multiplicativeExpression**(乘法表达式)- 一个
**primaryExpression**(主表达式) - 乘号或者除号
- 一个
**primaryExpression**(主表达式) - b 和 c 可以匹配0次或者多次
- 一个
**primaryExpression**(主表达式) 有变量 , 数字字面量 或者 括号 +**additiveExpression**(加法表达式) 组成数据结构设计
ASTNode 接口
type Node interface {Parent() NodeChildren() []NodeType() TypeText() string}
节点类型 ```go type Type int
const ( Program Type = iota //程序入口,根节点
IntDeclaration //整型变量声明ExpressionStmt //表达式语句,即表达式后面跟个分号AssignmentStmt //赋值语句Primary //基础表达式Multiplicative //乘法表达式Additive //加法表达式Identifier //标识符IntLiteral //整型字面量
) ```
