前言

程序语言是什么?
用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. 常州培训 day5 解题报告

    第一题:(贪心) 题目大意:给出N*M的矩形,要用正方形将它铺满(正方形之间不能重叠),相邻的正方形颜色不能相同,颜色用ABCD表示.要求从上到下从左到右字典序最小. N,M<=100 解题过程 ...

  2. CSS 垂直居中。

    1,display: table; display: table-cell <div style="border:solid red 1px ;height:200px;width:2 ...

  3. iOS 高效添加圆角效果实战讲解

    圆角(RounderCorner)是一种很常见的视图效果,相比于直角,它更加柔和优美,易于接受.但很多人并不清楚如何设置圆角的正确方式和原理.设置圆角会带来一定的性能损耗,如何提高性能是另一个需要重点 ...

  4. matlab中如何保留指定的变量的数据

    在使用matlab时,通常要将计算的结果保存到mat文件中.使用的命令是: save filename 但是用上述命令保存的时候,会将计算过程中的其他变量一起保存了.这中粗糙的保存有以下缺点: (1) ...

  5. IOS的变量前加extern和static字段

    IOS的变量前加extern和static字段 前一阵子,做项目的时候到网上找Demo,打开运行的时候发现其中变量前有关键字extern和static,所以我研究了一下子 对于extern来说可以理解 ...

  6. javascript 变量声明有var与无var 的区别

    1.在函数作用域内 加var定义的变量是局部变量,不加var定义的就成了全局变量.使用var定义var a = 'hello World';function bb(){var a = 'hello B ...

  7. (转)iOS消息推送机制的实现

    原:http://www.cnblogs.com/qq78292959/archive/2012/07/16/2593651.html iOS消息推送机制的实现 iOS消息推送的工作机制可以简单的用下 ...

  8. hdu 2061

    PS:  以为找个简单来恢复信心..结果碰到那么傻逼的题目... 题意:给出学分和成绩,算GPA...关键是注意换行....它要求的换行我觉得超级奇怪...除了第一个正常,其他的输入完之后先一个换行. ...

  9. javascript splice

    //arrayObject.splice(index,howmany,element1,.....,elementX)//index 必需.规定从何处添加/删除元素.(0)//howmany 必需.规 ...

  10. Mac 将mysql路径加入环境变量

    1.打开终端,输入: cd ~ 会进入~文件夹 2.然后输入:touch .bash_profile 回车执行后, 2.再输入:open -e .bash_profile 会在TextEdit中打开这 ...