惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
Vercel News
Vercel News
D
DataBreaches.Net
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
小众软件
小众软件
美团技术团队
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿
D
Docker
Martin Fowler
Martin Fowler
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
H
Hackread – Cybersecurity News, Data Breaches, AI and More
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
S
SegmentFault 最新的问题
云风的 BLOG
云风的 BLOG
B
Blog
雷峰网
雷峰网
The Cloudflare Blog

博客园 - Roland

几个基本的计算机概念 Silverlight 5几个不错的新特性 无光驱采用U盘安装完整版xp javascript 日期格式化(转) jQuery URL Parser 帮助 .net环境下的javascript引擎汇总 使用ANTLR进行命令行参数解析 使用VSTA定制二次开发IDE(一) .net与java中关于访问性的差异 基础知识之vb.net的拷贝构造函数 垃圾回收浅谈 ASP.NET 页面对象模型[转自Msdnchina] dotnetnuke小结 dotnetnuke中皮肤管理小问题 DNN中令人困惑的用户管理机制 第一次学习dotnetnuke [转帖]怎样成为优秀的软件模型设计者? [转帖]论程序设计方法 让VFP回到旧时代
探讨Antlr中文文法与英文文法的差异
Roland · 2009-03-21 · via 博客园 - Roland

Antlr是一个很好的词法和语法分析器,而且可以直接生成Tree walker,解决了编译器设计中的大麻烦。最近在利用Antlr开发自己的领域语言(DSL)的时候发现了一个问题,就是中文文法与英文文法的差异问题。

目前在领域语言的设计中,趋向于采用类似于自然语言的设计方式,例如:

I eat apple.

其中I是一个对象,eat 是对象I的方法,apple是传入到eat方法中的参数。这句话转换为面向对象的语言就是:

I.eat(apple); 

由于这样的文法非常接近自然语言,可以极大降低软件开发的进入门槛,使得业务专家们可以使用面向各自领域的语言开发软件。目前Ruby语言能够风靡世界,部分原因就是Ruby语法中可以省略括号,使得Ruby编写的代码在一定程度上接近于自然语言了。

类似与上述文法,我们希望基于中文的领域语言可以编写如下的文法:

我吃苹果   --> 我.吃(苹果);

由于近代计算机技术起源于西方国家,编译原理及相关的算法研究均基于英文的词法与语法研究,英文中词语的分割是依赖于空格的,这使得词法分析变得非常简单。而对于中文的词汇没有明显的区分,使得【我吃苹果】的词法分析变得非常困难。利用Antlr进行分析的时候,如果想把【我】分析为一个Token,需要有明显的起止符,如果把语句改写为【我_吃_苹果】,就比较容易分割了,但这又偏离了自然语言。

Antlr采用的是上下文无关的词法、语法分析方式,它不依赖于上下文的相关性,只需要空格即可定义出上述的语法结构。而对上述中文语法,如果想要把【我】分析为一个Token则需要在上下文中查找是否有定义【我】,如

在分析第二条语句的时候,就可以根据第一句中的定义把【我】作为一个Token来处理了。

根据《The Definitive ANTLR Reference: Building Domain-Specific Languages》书中描述,目前上下文相关的词法分析方式没有完整的算法支撑,所以在这个方向上也没有好的应用。

由于本人刚开始这方面的研究,观点不正确之处请大家批评指正。