SlideShare a Scribd company logo
代数组合子
从文本处理到代数化模式解析
常规的文本解析技术
• 字符串工具函数
• 标准库
• 常用工具库
• 正则表达式
正则表达式的优势与不足
• 使用简单,功能丰富
• 表达上下文相关模式困难
• 与宿主语言隔离
• 复杂的行为模式定义困难
Tex & Yacc 的优势与不足
• 功能强大
• 需要独立的构建/生成过程
• 需要混合定义语言和宿主语言
组合子
• 是代码库,而非工具程序
• 使用原生代码而非子语言
• 比正则表达式功能更完整
• 比编译器构建工具更轻量
Jaskell Parsec
• 源自 Haskell Parsec
• 为 JVM 语言提供自然的组合子实现
• 对组合子功能做代数化抽象
• 有独立的 Java 8 版本
算式解析和计算
Parsec 组合子工程实践
3.14+7*8-(2+3)=53.14
正确解析算术表达式并求值
我们最终将实现的
分析问题
• Expr := number | quote | binary
• Number := real number
• Quote := ( expr )
• Binary := expression `+|-|*|/` expression
实数解析
• R := scientific number | decimal | integer
• Unsigned := digit{1, n}
• Integer := [-] Unsigned
• Decimal := integer . Integer | Unsigned
• ScNumber := Decimail<e|E>[+-]Unsigned
科学计数法
Scn := decimal [e|E integer]
数值表达式
表达式算子
• Expr := number | quote | binary
• Number := real number
• Quote := ( expr )
• Binary := expression `+|-|*|/`
expression
括号算子
Quote.:= ( expr )
加减乘除
• Add := expr + expr
• Sub := expr + expr
• Product := expr * expr
• Divide := exprt / expr
表达式对象
• 递归树结构
• 根据优先级调整得到AST
• 解释器模式求值
二元算式
• 递归调整
• 四则运算各自实现求值逻辑
我们的成果
• Parser parser = new Parser()
• 支持四则运算
• 支持科学计数法
• 支持负数
• 支持括号
• 识别并跳过空白
Parsec 库的基本用法
• 将算子作用于状态对象,得到结果
• 将算子组合为新的算子,实现更多功能
• 以宿主语言的逻辑来定义新算子
• 状态可以单独抽象
Parsec 定义
• Functional 接口
• 提供 Functor 语法糖,如 bind 和 then
• 提供对文本和列表类型的辅助支持
• 原则上可以实现任意类型到任意类型的计算
State 定义
• 取值
• 终结
• 事务
• 状态
• 泛型
Common State
• 特化为仅面向整数索引
• 事务退化为索引标记
• 状态退化为索引
• 类似迭代器
Txt State
• 基于 CommonState
• 按字符迭代
• 提供行和邻域查询
内置原子算子
最基本的原子组件
one
• 简单的获取下一个
• 单位算子的形式定义
eof
仅在state到达eof时匹配成功
Equal
• 判等算子
• 众多实用算子的基本组件
Not Equal
• 不等判断
• Eq 的反义词
One Of
等于某一个
None Of
不等于任一个
Try
• 算子匹配失败时重制状态
• 重要的组合子
Many
• 重复解析0到多次
• 聚合结果
Many1
• 重复匹配 1 到多次
• 聚合结果
Skip
• 匹配 0 到多次
• 直接忽略结果
• 常用于文本处理中跳过空白
Skip1
• 匹配 1 到多次
• 直接忽略结果
• 常用于文本处理中跳过空白
Ch
• 匹配单个 Ch
• 可以忽略大小写
ChIn/ChNone
• one of 和 none of 的特化版本
• 支持忽略大小写
Text
• 匹配一段文本
• 输出匹配文本
• 重要的基础组件
空格
• 匹配空格
• 遵循Java标准库规范
• 重要的基础组件
空白
• 遵循Java标准
• 匹配任意空白
• 返回匹配结果
自定义组合子
• 充分利用 Java 语法
• 根据具体需要精确定义算子行为
组合子的适用范围
• 上下文相关的复杂文本分析
• SQL 语句分析,重写和安全检查
• URL/Email/IP 有效性判定
• 表达式解析和计算
• 二次开发平台和 DSL 构建
组合子的不足
• 规则引擎
• 生成的代码可能不够快
• Debug 不是非常直观
• Java 版本不够简洁
溯源
Parsec 的官方实现:
Haskell Parsec
Jaskell Java8
• Jaskell 实用项目
• 支持 Java 8
• 经过实用项目考验
• 不引入第三方依赖
Q&A
谢谢大家!

More Related Content

Similar to Jaskell Core Parsec

Duck Typing and Multiple Inheritance
Duck Typing and Multiple InheritanceDuck Typing and Multiple Inheritance
Duck Typing and Multiple Inheritance
Sway Wang
 
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJava SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
 
Google Dart 介紹
Google Dart 介紹Google Dart 介紹
Google Dart 介紹Ticore Shih
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
Justin Lin
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
Angel Boy
 
使用 .NET Standard 開發跨平台應用程式
使用 .NET Standard 開發跨平台應用程式使用 .NET Standard 開發跨平台應用程式
使用 .NET Standard 開發跨平台應用程式
Gelis Wu
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
Qiangning Hong
 
DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略
Will Huang
 
Java program in_action
Java program in_actionJava program in_action
Java program in_action
mysqlops
 
Java program in_action_20110727-撒迦
Java program in_action_20110727-撒迦Java program in_action_20110727-撒迦
Java program in_action_20110727-撒迦
chenjianxing
 
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術
Yu Lung Shao
 
那些函數語言Tutorial沒有教我的事
那些函數語言Tutorial沒有教我的事那些函數語言Tutorial沒有教我的事
那些函數語言Tutorial沒有教我的事YC Ling
 
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
悦 温
 
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
開放原始碼 Ch2.4   app - oss - db (ver 1.0)開放原始碼 Ch2.4   app - oss - db (ver 1.0)
開放原始碼 Ch2.4 app - oss - db (ver 1.0)My own sweet home!
 
编辑器设计U editor
编辑器设计U editor编辑器设计U editor
编辑器设计U editortaobao.com
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]yiditushe
 
運用MMLSpark 來加速Spark 上 機器學習專案
運用MMLSpark 來加速Spark 上機器學習專案運用MMLSpark 來加速Spark 上機器學習專案
運用MMLSpark 來加速Spark 上 機器學習專案
Herman Wu
 
W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探
美团点评技术团队
 
Multi thread 多執行緒程式設計(use c#)
Multi thread 多執行緒程式設計(use c#)Multi thread 多執行緒程式設計(use c#)
Multi thread 多執行緒程式設計(use c#)
Gelis Wu
 

Similar to Jaskell Core Parsec (20)

Duck Typing and Multiple Inheritance
Duck Typing and Multiple InheritanceDuck Typing and Multiple Inheritance
Duck Typing and Multiple Inheritance
 
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJava SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
 
Google Dart 介紹
Google Dart 介紹Google Dart 介紹
Google Dart 介紹
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
 
使用 .NET Standard 開發跨平台應用程式
使用 .NET Standard 開發跨平台應用程式使用 .NET Standard 開發跨平台應用程式
使用 .NET Standard 開發跨平台應用程式
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
Android工作坊
Android工作坊Android工作坊
Android工作坊
 
DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略
 
Java program in_action
Java program in_actionJava program in_action
Java program in_action
 
Java program in_action_20110727-撒迦
Java program in_action_20110727-撒迦Java program in_action_20110727-撒迦
Java program in_action_20110727-撒迦
 
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術
 
那些函數語言Tutorial沒有教我的事
那些函數語言Tutorial沒有教我的事那些函數語言Tutorial沒有教我的事
那些函數語言Tutorial沒有教我的事
 
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
 
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
開放原始碼 Ch2.4   app - oss - db (ver 1.0)開放原始碼 Ch2.4   app - oss - db (ver 1.0)
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
 
编辑器设计U editor
编辑器设计U editor编辑器设计U editor
编辑器设计U editor
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]
 
運用MMLSpark 來加速Spark 上 機器學習專案
運用MMLSpark 來加速Spark 上機器學習專案運用MMLSpark 來加速Spark 上機器學習專案
運用MMLSpark 來加速Spark 上 機器學習專案
 
W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探
 
Multi thread 多執行緒程式設計(use c#)
Multi thread 多執行緒程式設計(use c#)Multi thread 多執行緒程式設計(use c#)
Multi thread 多執行緒程式設計(use c#)
 

More from March Liu

轻量级文本工具集
轻量级文本工具集轻量级文本工具集
轻量级文本工具集
March Liu
 
奇点与未来
奇点与未来奇点与未来
奇点与未来
March Liu
 
尼尔盖曼的美国众神
尼尔盖曼的美国众神尼尔盖曼的美国众神
尼尔盖曼的美国众神
March Liu
 
创业项目中常见的技术和管理债务
创业项目中常见的技术和管理债务创业项目中常见的技术和管理债务
创业项目中常见的技术和管理债务
March Liu
 
It工程师的职业成长
It工程师的职业成长It工程师的职业成长
It工程师的职业成长
March Liu
 
Xcode tutorial
Xcode tutorialXcode tutorial
Xcode tutorial
March Liu
 
Socrates Used PostgreSQL and SQLAlchemy
Socrates Used PostgreSQL and SQLAlchemySocrates Used PostgreSQL and SQLAlchemy
Socrates Used PostgreSQL and SQLAlchemy
March Liu
 
PostgreSQL 9 1 新特性
PostgreSQL 9 1 新特性PostgreSQL 9 1 新特性
PostgreSQL 9 1 新特性March Liu
 
Emacs Introduction
Emacs IntroductionEmacs Introduction
Emacs Introduction
March Liu
 
软件开发工程化的个人体验
软件开发工程化的个人体验软件开发工程化的个人体验
软件开发工程化的个人体验
March Liu
 
Python速成指南
Python速成指南Python速成指南
Python速成指南
March Liu
 
Python 数据库技术第三讲
Python 数据库技术第三讲Python 数据库技术第三讲
Python 数据库技术第三讲
March Liu
 
Python 数据库技术讲座(二)
Python 数据库技术讲座(二)Python 数据库技术讲座(二)
Python 数据库技术讲座(二)
March Liu
 
Python 数据库技术讲座(一)
Python 数据库技术讲座(一)Python 数据库技术讲座(一)
Python 数据库技术讲座(一)
March Liu
 
Python 数据库技术
Python 数据库技术Python 数据库技术
Python 数据库技术
March Liu
 
PostgreSQL 9 的 standby 集群实践
PostgreSQL 9 的 standby 集群实践PostgreSQL 9 的 standby 集群实践
PostgreSQL 9 的 standby 集群实践
March Liu
 
PostgreSQL 9 Standby
PostgreSQL 9 StandbyPostgreSQL 9 Standby
PostgreSQL 9 Standby
March Liu
 
基于 PostgreSQL 的关系型数据库方案
基于 PostgreSQL 的关系型数据库方案基于 PostgreSQL 的关系型数据库方案
基于 PostgreSQL 的关系型数据库方案
March Liu
 
About Me
About MeAbout Me
About Me
March Liu
 
1 Python简介
1 Python简介1 Python简介
1 Python简介
March Liu
 

More from March Liu (20)

轻量级文本工具集
轻量级文本工具集轻量级文本工具集
轻量级文本工具集
 
奇点与未来
奇点与未来奇点与未来
奇点与未来
 
尼尔盖曼的美国众神
尼尔盖曼的美国众神尼尔盖曼的美国众神
尼尔盖曼的美国众神
 
创业项目中常见的技术和管理债务
创业项目中常见的技术和管理债务创业项目中常见的技术和管理债务
创业项目中常见的技术和管理债务
 
It工程师的职业成长
It工程师的职业成长It工程师的职业成长
It工程师的职业成长
 
Xcode tutorial
Xcode tutorialXcode tutorial
Xcode tutorial
 
Socrates Used PostgreSQL and SQLAlchemy
Socrates Used PostgreSQL and SQLAlchemySocrates Used PostgreSQL and SQLAlchemy
Socrates Used PostgreSQL and SQLAlchemy
 
PostgreSQL 9 1 新特性
PostgreSQL 9 1 新特性PostgreSQL 9 1 新特性
PostgreSQL 9 1 新特性
 
Emacs Introduction
Emacs IntroductionEmacs Introduction
Emacs Introduction
 
软件开发工程化的个人体验
软件开发工程化的个人体验软件开发工程化的个人体验
软件开发工程化的个人体验
 
Python速成指南
Python速成指南Python速成指南
Python速成指南
 
Python 数据库技术第三讲
Python 数据库技术第三讲Python 数据库技术第三讲
Python 数据库技术第三讲
 
Python 数据库技术讲座(二)
Python 数据库技术讲座(二)Python 数据库技术讲座(二)
Python 数据库技术讲座(二)
 
Python 数据库技术讲座(一)
Python 数据库技术讲座(一)Python 数据库技术讲座(一)
Python 数据库技术讲座(一)
 
Python 数据库技术
Python 数据库技术Python 数据库技术
Python 数据库技术
 
PostgreSQL 9 的 standby 集群实践
PostgreSQL 9 的 standby 集群实践PostgreSQL 9 的 standby 集群实践
PostgreSQL 9 的 standby 集群实践
 
PostgreSQL 9 Standby
PostgreSQL 9 StandbyPostgreSQL 9 Standby
PostgreSQL 9 Standby
 
基于 PostgreSQL 的关系型数据库方案
基于 PostgreSQL 的关系型数据库方案基于 PostgreSQL 的关系型数据库方案
基于 PostgreSQL 的关系型数据库方案
 
About Me
About MeAbout Me
About Me
 
1 Python简介
1 Python简介1 Python简介
1 Python简介
 

Jaskell Core Parsec