stream, parser, 文法的一些概念

2023-11-03

stream就是个Iterable<Unit>,最基础的unit是bit,对应二进制流,

从二进制流到character流Iteralbe<Character>是encoding解决的问题,

再往上一个层次是token流,或者word流

1)基础的tokenize就是自然token,即按分隔符切割的,alphabet字符(a-z,1-9等)和非alphabet字符(空格,标点,括号等。

2)自然token不一定是和合法的token,token还必须是语言接受的(预定义的),英文字典里没有的单词就是非法英文单词,再者,像中文这种没有空格分隔的语言,是不存在自然token的,必须用预定义的某种规则识别。

预定义的方式可以是像英文词典那样的有限的,罗列出所有实例,还有一个例子是程序语言的关键字集合;更多是用规则定义,即所谓formal language的概念,就是可以用有限的规则定义出无限的集合。比如正则表达式。规则往往不只一种,一种规则对应一种类型的token。

比如程序语言里,当前字符流是以int开始的,可以解读为identifier,也可以解读为keyword,这里就有一个问题,用哪个规则去匹配呢,有两个原则

1)规则是有优先级的,或者说有顺序的,按顺序一个一个试,前面的匹配了,就不用考虑后面的规则了

2)匹配多长问题,优先匹配长的,比如 “==”,单等号可以赋值匹配运算符,双等号可以匹配比较运算符,匹配长的,即双等号。

这一部分叫词法分析,lexical analysis、tokenize,输出是一个合法的token stream:Iterable<Token>。注意token即包含了分出的词的文本,也包含了类别信息,这一点和01流到Character流不同,Character是没有类别的,token除了文本还有类别,(动词?名词?冠词?)

之前都是从一种流到另一种流

01流 ---encoding--> Character流 --tokenize---> token流

之后的parse部分,不再是输出另一种流,不再是一种线性结构,而是树结构,语法树。这里用到的文法一般是上下文无关文法,对应上下文无关语言。上下文无关意思是非终结字符的展开不依赖于两边的上下文。

正则文法 < 上下文无关文法 < formal grammar

正则文法就是用字符和三种规则(union, concatenation, iteration) 表达的语言。因为正则是CFG的子集,可以用CFG描述正则文法:

R -> alphabet character

R-> RT

T->R| e

R-> R|R

为什么要把左递归该为右递归?

因为右递归是先parse了一部分才递归的,也就是输入在收敛的递归,这种递归是真正的递归。左递归,输入没有任何变化。


为什么要Left Factor?

一个产生式的多个alternative有相同的开始token,改写一下,提取公共factor,最终使得每个alternative的开始token都不同,left factor 保证只有一个production是可行的,因为起始token不同。

自顶向下的parse基本是个路径搜索问题,从start非终结字符(相当于root)开始,分别尝试不同的alternative的产生式。要消除左递归,并且进行left factoring(剪枝作用,根据当前token有预见性的选择alternative)。一个输入token流,如果可以对应多棵parse tree,则这个CFG文法是具有二义性的。无二义性的的CFG从路径搜索的角度就是有且只有一条路径,一个可行解。

leetcode wordbreak ||是分词问题还是parse问题?答案是parse问题,parse问题的特点是整体性,要使得整体匹配。分词只需要考虑自己,不需要考虑对后续其他词的影响。word break以现在的知识点看应该是一种二义性(有多个可行解)、上下文相关的文法。









本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stream, parser, 文法的一些概念 的相关文章

  • Mysql数据库简单配置

    1 将安装包下载到本地文件路径 按照自己的情况 2 配置ini文件 放在mysql安装目录 没有文件名 解决方法 3 终端切换目录到安装目录下的bin目录下 建议配置环境变量 后面直接通过命令开启服务 直接双击path也可以进入 然后点击新

随机推荐

  • module “**.vue“ has not default

    module vue has not default 这个问题造成的原因是因为你在vue config js中设置了happyPackMode选项 如下所示 config module rule ts use ts loader loade
  • 初识注解

    注解的英文单词 Annotation 3 有一个public修饰的 入口 4 且该public修饰的类名必须与文件名相同 5 并且一个源文件可以只有非public类 package com kuang Annotation 测试元注解 im
  • 用一个函数实现用选择法对5个整数按升序排序

    用一个函数实现用选择法对5个整数按升序排序 选择法思想 先选出5个数中最小的数 把它和score 0 交换 这样a 0 就是5个数中最小的数了 再在剩下4个数 score 1 到score 4 中选出最小的数 把它和score 1 交换 这
  • kafka基本知识

    kafka 消息队列是什么 解决什么样的问题 有什么常见的应用场景 MQ message queue 消息队列是本质上是队列 先进先出的数据结构 生产者将消息放到队列上 消费者通过 消息的消费者通过拉取或者订阅推送的机制来获取消息 解决的问
  • 梯度消失和梯度爆炸及解决方法

    原文链接 感谢原作者 一 为什么会产生梯度消失和梯度爆炸 目前优化神经网络的方法都是基于BP 即根据损失函数计算的误差通过梯度反向传播的方式 指导深度网络权值的更新优化 其中将误差从末层往前传递的过程需要链式法则 Chain Rule 的帮
  • Python读写EXCEL文件常用方法

    python读写excel的方式有很多 不同的模块在读写的讲法上稍有区别 这里我主要介绍几个常用的方式 用xlrd和xlwt进行excel读写 用openpyxl进行excel读写 用pandas进行excel读写 一 数据准备 为了方便演
  • (五)pandas-修改数据

    pandas修改数据可以通过以下几种方式 1 通过切片定位到数据位置 然后直接赋值 2 mask where 两个函数 3 replace函数 4 apply函数 以下图df为例 1 切片方式 切片方式用于通过下标 标签直接定位到指定位置
  • 高性能Key/Value存储引擎levelDB, rocksDB, TiDB,InnoDB

    高性能存储引擎levelDB rocksDB TiDB InnoDB 1 简单介绍 1 1 LevelDB LevelDB是Google开源的持久化KV单机数据库 具有很高的随机写 顺序读 写性能 但是随机读的性能很一般 也就是说 Leve
  • 在windows系统中使用Ceres非线性优化库:(一)安装Ceres库

    一 安装Ceres库 1 用vcpkg安装Ceres库 1 1 安装vcpkg 1 2 安装Ceres 1 3 配置Ceres 2 用Virtual Studio安装Ceres库 2 1 下载ceres windows 2 2 打开或升级解
  • mysql查询每个学生最高分_mysql查询各班最高分学生的信息

    学生表student 班级表class 课程表subject 成绩表score 一 查询各班最高分学生的信息 1 从成绩表score中查询每个学生的总成绩并按降序排列 select sc stu id sum sc score sumsco
  • 小程序图片懒加载放在服务器,【小程序】使用uni-app搭建小程序环境---图片懒加载...

    延迟加载的理念 页面初始化时 暂不加载处于屏幕可见区域之外的图片 该方案会有如下几大好处 n加快页面渲染速度 n提升页面滚动性能 n默认不下载屏幕外的图片 减少网络流量 主标题 列表二级标题 exportdefault data varim
  • 手写Android事件分发

    Android事件分发原理搞清楚可以辅助我们解决很多实际项目中遇到的事件冲突等问题 1 进入正题之前 问大家几个事件相关的问题 标签 dispatchTouchEvent Q1 Android点击事件传递规则是怎样的 下面几步仔细阅读2遍
  • Gradle基础知识

    转自 https blog csdn net xingzhong128 article details 80290166 前言 随着业务需求变得越来越复杂 项目的规模也变得越来越大 项目越大包含的代码资源文件也就越多 而越大的项目往往需要越
  • 图书管理系统(包含找回密码、设置密保等) C语言

    目录 一 需求分析 二 概要设计 1 程序设计框架 2 数据结构 3 模块函数划分 三 详细设计 1 main主函数 2 主菜单函数 3 密保 4 管理员登录 5 修改管理员账号和密码 6 录入图书 7 输出图书 8 修改图书 9 删除图书
  • android-studio undefined reference to `__android_log_print

    最近在使用android studio编译安卓程序 要用到jni 我在jni源码中引用了 android log print 且在Android mk中加了LOCAL LDLIBS llog 但是编译时还是会出现如下错误 Error 82
  • PHP 实现抽奖功能

    1 场景 商品抽奖 用户参与抽奖后 分享页面给新用户 并且新用户也参与抽奖 然后为上个用户增加一次抽奖码 2 问题 用户获得的抽奖码机会只为了增加自己的中奖概率 一次活动的产品一个用户只 能中一次 public function index
  • 00天精通Python(基础篇)——第10天:字符串格式化

    文章目录 python中常用的数据类型占位 示例 示例代码 python中常用的数据类型占位 示例 占位符 变量 占位符 s d f 我们可以通过如下语法 完成字符串和变量的拼接 示例代码 name 科比 time 2006 score 8
  • getCurrentInstance

    https blog csdn net m0 46318298 article details 130726043 注 是在vue中所有实例中都可用的一个简单约定 这样做会避免和已被定义的数据 方法 计算属性产生冲突
  • ‘pip’不是内部或外部命令---Python+OpenCV配置过程中常见问题

    1 用pip进行安装时 输入pip命令会提示 pip 不是内部或外部命令 在python安装目录中找得到script文件夹 查看文件夹内部是否存在pip3 exe这个文件 下面以我的电脑为例 如果没有 在命令行输入 python m ens
  • stream, parser, 文法的一些概念

    stream就是个Iterable