前言

程序语言是什么?
用wiki上的描述,程序语言是一种人工设计的语言,用于通过指令与机器交互;程序语言是编程程序的标记,而程序是一种计算或算法的描述。详细介绍和背景信息参考:
Programming_language(http://en.wikipedia.org/wiki/Programming_language)
Programming_language_generations(http://en.wikipedia.org/wiki/Programming_language_generations)  
History_of_programming_languages(http://en.wikipedia.org/wiki/History_of_programming_languages)。
 
那如何确定程序语言是合法的(well-formed)呢?
识别器(reccognizer)!
 
大家都这么懒,有什么简单的方法能自动生成程序语言?
工具早被视为不是银弹了,不过像eclipse EMF、PD等建模工具提供了代码生成(code generation)功能。
但是如果想像一些开源软件,暴露出xml格式的配置文件,根据这些配置文件再做一些逻辑处理,这时需要解析xml文件;进一步,如果定义了自己的内部数据格式,每次使用时都得解析;再进一步,在数据格式中融入可变的逻辑操作,实现解析功能的代码恐怕没有那么简单了。
直观的感觉,只要有格式,冥冥之中总会存在能够描述这种格式的方法,文法/语法是很好的候选者。
那这好像跳入了编译原理这个大坑里,幸好有了Parr的工作。
 
内容
状态机(statemachine)/确定有限自动机deterministic finite automation, DFA)
句子的树结构
语言的歧义(ambiguous):文法所无法描述的语言特征:短语上下文依赖(context dependency)、短语优先级(precedence)
 
1 自动机
如当前法国人尝试用固定的方程描述上帝所做的一切一样,面对问题时,人们总是期望可以通过建模,在有限步骤内解决。
状态机可以用于生成语句吗?Parr举了个简单英文语句生成状态机的例子:(该图用graphviz(http://www.graphviz.org/)重新生成)
这是一个DFA。
 
但同法国人的失败一样,状态机不能避免生成不符合某种规范/约束要求的语句的情况,例如my truck is sad;Parr指出其原因有:语法中表达不出含义,句中短语可能存在依赖和顺序关系。
 
通过状态机生成的语言称为正则语言(regualr languages),状态机在生成语言发面的缺陷的本质在于它无记忆,即无法记住它之前生成过什么。
 
2 树
树作为一种数据结构的抽象,在计算机科学中扮演着很重要的角色,以至于在遇到需要存在嵌套和顺序关系时,IT从业者总会想到树。
树在生成语句时称为推导树(derivation tree),而在识别语句时称为解析树(parse tree)。下图是文中给出的赋值语句的树结构示例:

从分治策略(divide and conquer)角度看,这些箭头都可以理解为方法的调用,自然而然的可以在状态机基础上添加方法调用和返回功能。

 
那如何在状态机中添加记忆功能呢?栈(stack)!
就跟方法调用一样,参数和方法返回地址等信息用栈保存是极便利的。这点在Java虚拟机规范中的每个方法对应一个stack frame可以说明这一点。
加了栈的状态机成为自顶向下状态机(pushdown automation)。
 
这个语法图又是什么?

恩,也是一个状态机,好高端的样子,在Oracle SQL官方文档中也可以看到。

该语法规则是递归的,幸运的是它不是左递归的。关于左递归,看看下面的Java代码片段:
void expr(){
expr();
otherMethod();
}
一旦调用,时间或长或短,JVM绝对会报StackOverflowError,在适当配置VM运行参数的情况下,吐出点东西来,作为诅咒你的证据。
 
3 语言结构的歧义
程序语言的歧义是指,在语法图中,一个句子可以用多条路径生成。举个例子:3+4×5,是该解释为(3+4)×5还是3+(4×5)。
ANTLR3提供了谓词用于解决歧义问题:表达规则间优先级的语法谓词(syntactic predicate)和作为语言结构识别运行时布尔开关的语义谓词(semantic predicate)。这点在后面的笔记中再做记录。
 
 

ANTLR3完全参考指南读书笔记[02]的更多相关文章

  1. ANTLR3完全参考指南读书笔记[01]

    引用 Terence Parr. The Definitive ANTLR Reference, Building Domain Specific Languages(antlr3 version). ...

  2. ANTLR3完全参考指南读书笔记[06]

    前言 这段时间在公司忙的跟狗似的,但忙的是没多少技术含量的活儿. 终于将AST IR和tree grammar过了一遍,计划明天写完这部分的读书笔记.   内容 1 内部表示AST构建 2 树文法   ...

  3. ANTLR3完全参考指南读书笔记[08]

    前言 不要让用户被那些“专业术语”吓住! 用心设计的提示和反馈信息是软件设计者的“职业良心”.   内容 1 存在哪些错误? 2 美化错误提示 3 错误恢复策略   1 存在哪些错误? 在DSL语言开 ...

  4. ANTLR3完全参考指南读书笔记[07]

    前言 真正意义上的程序员都很懒,懒的连多余的一行代码也不写. 如果能将底层满手油污的活儿都可以交给别人去做,自己就扮演个智囊团成员的角色,生活会比想象中的还要惬意. 严格的按照指令执行长时间不知疲倦的 ...

  5. ANTLR3完全参考指南读书笔记[05]

    前言 仅生成给出true/false的识别器是没有多大用处的,自然的就有在识别过程中遇到某一结构时执行一段代码.存储该结构中信息的想法. ANTLR提供了在文法中嵌入属性和动作超级混合“文法”,可以生 ...

  6. ANTLR3完全参考指南读书笔记[04]

    前言 学习框架或第三方库的方法是什么 (1)少量的浏览manual或tutoral,只关注程序所需的特征,再完善其详细内容和特征的认识? (2)花大量的时间研究详细内容,再考虑程序实现? 这是个先有鸡 ...

  7. ANTLR3完全参考指南读书笔记[03]

    前言 文中第4章内容有点多,有点枯燥,但不坚持一下,之前所做的工作就白做了. 再次确认一下总体目标: protege4编辑器中Class Definition中语法解析和错误提示: Java虚拟机规范 ...

  8. 《The Linux Command Line》 读书笔记02 关于命令的命令

    <The Linux Command Line> 读书笔记02 关于命令的命令 命令的四种类型 type type—Indicate how a command name is inter ...

  9. 强化学习读书笔记 - 02 - 多臂老O虎O机问题

    # 强化学习读书笔记 - 02 - 多臂老O虎O机问题 学习笔记: [Reinforcement Learning: An Introduction, Richard S. Sutton and An ...

随机推荐

  1. [Js]Ajax

    一.什么是Ajax 不刷新的情况下读取数据或提交数据 (最早出现ajax:谷歌地图,拖动一下出现一片新的视野) 应用:用户注册.在线聊天.微博 特性:只能从服务器上去读取数据(所以我们需要配置自己的服 ...

  2. 文本信息“welcome to java programming!”

    import javax.swing.JOptionPanepublic class welcome {public static void main(string[] arg){JOptionPan ...

  3. bzoj 2049: [Sdoi2008]Cave 洞穴勘测

    #include<cstdio> #include<iostream> using namespace std; ][],n,m,fa[],st[]; ]; bool isro ...

  4. 如何在android项目中引用project作为类库引用

    前言: 在我们开发项目的时候,存在很多多个项目共有一个资源.逻辑代码的情况,这种情况一般我们采用在开发项目中导入别的项目作为引用的类库.资源等. 操作: 1.  新建一个android项目common ...

  5. POJ 2159 Ancient Cipher 难度:0

    题目链接:http://poj.org/problem?id=2159 #include <cstring> #include <cstdio> #include <cc ...

  6. JSON初步

    1.什么是JSON (1)JSON(Java Script Object Notation)是一种轻量级的数据交换语言, 以文本字符串为基础,且易于让人阅读 XML就是一个重量级的数据交换语言 (2) ...

  7. 远程连接Windows2008R2时服务器报Terminal Services错误的解决办法

    症状: 使用终端服务客户端连接到Windows Server2008 R2的机器时,如果客户端选项中选择了打印机(注1)时,它可能会在在系统事件日志中记录一个TerminalServices打印机错误 ...

  8. 五大要求让BPM与企业对接

    BPM(即业务流程管理)在中国已经有多年的发展历史,但人们经常提到的还是企业对流程的迫切需要,鲜有人讨论什么样的企业才能实施BPM,或者换句话说BPM的本身对企业有什么要求.不是所有的工作都适合BPM ...

  9. sql左连接,右连接,内连接

    1.sql查询时什么叫左连接和右连接    左连接和右连接都是外部连接,也就是区别于内部连接,它对不满足连接条件的行并不是象内部连接一样将数据完全过滤掉,而是保留一部分数据,行数不会减少.    左或 ...

  10. 统计一段文字中出现频率最高的10个单词(c语言)

    注:这次使用C语言做的这个程序.个别不懂的地方和算法部分是请教的其他同学,交流并吸收,所以收获颇多! 在程序中每一个地方我都做了注释,方便同学之间交流.也让老师容易看.程序也有很多不足的地方,但限于本 ...