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

推荐订阅源

F
Fortinet All Blogs
宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
T
The Exploit Database - CXSecurity.com
Help Net Security
Help Net Security
腾讯CDC
Project Zero
Project Zero
C
CXSECURITY Database RSS Feed - CXSecurity.com
IT之家
IT之家
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
L
LINUX DO - 最新话题
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Threatpost
N
News | PayPal Newsroom
C
Cybersecurity and Infrastructure Security Agency CISA
Hacker News - Newest:
Hacker News - Newest: "LLM"
S
SegmentFault 最新的问题
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Proofpoint News Feed
A
Arctic Wolf
B
Blog RSS Feed
Forbes - Security
Forbes - Security
P
Privacy & Cybersecurity Law Blog
Attack and Defense Labs
Attack and Defense Labs
V2EX - 技术
V2EX - 技术
P
Proofpoint News Feed
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
阮一峰的网络日志
阮一峰的网络日志
aimingoo的专栏
aimingoo的专栏
T
Tenable Blog
MyScale Blog
MyScale Blog
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学
W
WeLiveSecurity
D
DataBreaches.Net
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
罗磊的独立博客
The Last Watchdog
The Last Watchdog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
Vulnerabilities – Threatpost
美团技术团队
Microsoft Security Blog
Microsoft Security 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》书中描述,目前上下文相关的词法分析方式没有完整的算法支撑,所以在这个方向上也没有好的应用。

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