首页 > 其他分享 >Pratt Parser解释器_TDOP_自上而下的运算符优先解析

Pratt Parser解释器_TDOP_自上而下的运算符优先解析

时间:2022-12-23 21:44:09浏览次数:55  
标签:TDOP 优先级 符号 前序 Parser 运算符 NUM 中序 表达式

Partt Parser又称普拉特语法分析器。

指 沃尔-普拉特所编写的论文《Top Down Operator Precedence》中的基于定义优先级运算符的方式解析为AST树的一种语法分析技术。 

 

在执行语法分析器的时候,我们的已经的到了经过词法分析器的结果。

也就是

1+2+3
Token Type
1 NUM
+ ADD
2 NUM
+ ADD
3 NUM
1-5*3+5
Token Type
1 NUM
- MIN
5 NUM
* MUL
3 NUM
+ ADD
5 NUM

当我们得到单元集合之后,就是需要语法分析器去处理这个单元之间的关系。

Partt解析器则是通过单元优先级规则的一种解析器。

简单的说就是根据每个单元的类型划分为前序和中序,并按照[前序-中序]的规则不断从单元集合的第一位推进到最后一位.

 

 

这个所谓的前序和中序是符号可以出现的位置。

例如

1就是前序

+就是中序

-则是前序,因为减号可以当作负数或者减法符号,所以减法同时是中序。

例子

1+2+3

这个四则表达式中存在了数字和加法两种符号。

我们简单的分析一下前序和中序,以及解释器能够推进的方法。

序列 类型 优先级
前序 1 0
中序 + 1
前序 2 0
中序 + 1
前序 3 0

这个表格中,多出了一个优先级,这个解释器能够推进的根本。除去前序,中序的固定搭配之外,能够推进的秘密就是优先级的高低。

这个优先级是按照,基本的数学规定。

也就是 先算乘除  后算加减

因为 数字也是计算单元的一部分,只不过没有被数学规定计算的优先级,所以默认为最低的。

也就是下表

符号 优先级
NUM 0
+ 1
- 1
* 2
/ 2

最终合成下表

顺序 符号 优先级
前序 NUM 0
中序 + 1
前序 -[负号] 1
中序 -[减法] 1
中序 * 2
中序 / 2

解释器根据符号的优先级和符号结合性形成了AST

例一

1+2+3

AST就是

 

例二

1+2*3-4

AST

优先级的作用AST树中是分配【当前表达式】是否继续按照【前序-中序】的顺序匹配下一个表达式。

【前序-中序】可以理解为

【前序】生成最顶层叶子节点的左侧表达式

【中序】将【前序】表达式作为最终或者当前表达式的左侧节点,右侧节点并且依旧按照【前序-中序】的顺序匹配。

 这个解释器的结构总是【前序-中序】,一个表达式的开始肯定是一个【前序】处理之后在处理【前序】直到结束或者下一个token优先级大于当前可以执行【中序】。

【中序】则是将【前序】的表达式作为当前结果的左侧表达式,右侧表达式又是从【一个表达式的开始】也就是【前序】开始处理下一个token,换句话说又开始执行【前序-中序】这个结构。

 简单总结下

1.入口【前序-中序】

2.【前序】

3.下一个优先级大于当前【判断是否进入中序】或者token集合不结束.

4.【中序】

5.将【前序】作为左侧表达式

6.执行1,并将结果作为右表达式

7.依次返回

8.出口【前序-中序】

 

优先级为什么要当前的Token级别大于下一个Token级别才可以执行中序。

举例

 

这是一个树状图。

我们可以得到(中序遍历)

1+2*3

 在这个程度上加一呢?

 

 

 

如果是1+2*3*4*5(在表达式1+2*3的基础上添加*4*5)呢

 

 

 

在添加一个表达式时,AST会

1.如果这个表达式是和顶点不同级优先级则会增加叶子层数,改变右侧叶子顶点为最新表达式token,并将原先叶子归为左叶子节点,新加表达式为右侧叶子节点

 

 

2.如果这个表达式是和顶点同级优先级则是增加叶子层数,改变顶点为最新表达式token和同时原先将左右叶子归为左侧叶子,右侧叶子节点放置新加表达式

 

 

优先级主要是决断二叉树是否更换顶点,打断原有的结构顺序。

括号的作用也就可以在这里直接说明,因为括号也是打断原有括号,括号是前序运算符,所以只需要打断括号后第一个符号的等级,使得可以接纳所有符号直到括号结束。也就是说只需要像默认开始一样函数就OK了。

 

代码层面需要明确知道两个东西,当前符号和下一个符号,以及划分前序,中序,优先级等级 以及对应函数的方法。

代码虽然不多,也是小500了  我直接放代码地址吧

自上而下的运算符优先级分析: 自上而下的运算符优先级分析(也称普拉特解析法 (gitee.com)

 

标签:TDOP,优先级,符号,前序,Parser,运算符,NUM,中序,表达式
From: https://www.cnblogs.com/T-ARF/p/16977378.html

相关文章

  • 2.Java基本语法(上):变量与运算符.md
    一、关键字和保留字关键字(keyword)的定义和特点定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所有字母都为小写官方地址:​​https://docs.oracle.c......
  • 一篇文章带你了解Java中的运算符
    前言在前一篇文章中,壹哥给大家讲解了Java数据类型之间的转换,包括自动类型转换、强制类型转换、隐含的强制类型转换等问题。且在上一篇文章中,我还简单地给大家提到了Java的......
  • 关于异或和一些运算符
    上课的时候经常摸鱼,连异或都没搞懂,今天看map源码的时候才注意到有一个看不懂的计算符staticfinalinthash(Objectkey){inth;return(key==nul......
  • Kotlin学习快速入门(12)—— 位运算符
    由于不懂pythod,最近拜托朋友研究下解密live2d模型的解密算法,朋友写出了Java的代码之后我进行改版,在转为kotlin的时候,发现kotlin自动转换有些坑,以及kotlin中的位运算......
  • EL_获取域中存储的值List集合&Map集合值以及empty运算符和隐式对象pageContext
    EL_获取域中存储的值List集合&Map集合值List集合:${域名称.键名[索引]}<%Useruser=newUser();user.setName("张三");user.setAge(23......
  • EL概述以及运算符
    EL概述以及运算符1.概念:Expression Language:表达式语言2.作用:替换和简化jsp页面java代码的编写3.语法:${表达式}4.注意:jsp默认支持el表达式。如果要忽略表达式......
  • while循环、break、格式化、运算符、编码初始
    1、while循环:不断的重复着某件事就是循环2、while循环图解:3、break:终止当前循环。4、continue就是跳出本次循环、继续下次循环。下方代码都不会执行。......
  • C++——拷贝构造和运算符重载
    1.拷贝构造函数1.值传递#include<iostream>usingnamespacestd;classdate{public:date(intyear=1,intmonth=1,intday=1)//全缺省构造{_year=year;......
  • sumBy 数字运算符
    _=require('lodash');//varasync=require('async');//varasyncSave=require('asyncSave');varobjects=[{'n':4},{'n':2},{'n':8},{'n':6}]......
  • T-SQL中的运算符
    --算数运算符SELECT3+4AS 加的结果GOSELECT5/2AS除的结果--2.5左右两边都是整数,结果是整数GOSELECT5.0/2AS除的结果 --两边......