前言

程序语言是什么?
用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]表格排序

    思路:遍历每个li,并把它们存放到数组中去,然后通过sort()方法进行排序,再插入 <body>    <input type="button" value=& ...

  2. L1 - 运行机制

    var name = 'kl'; function person(){ alert(name); var name = 'ko'; } person(); 这段代码输出 ‘undefined’,这种现 ...

  3. bzoj 1911: [Apio2010]特别行动队

    #include<cstdio> #include<iostream> #define M 1000009 #define ll long long using namespa ...

  4. C++定义构造函数必须使用初始化列表的场合

    明其理,而知其然也. 先给理论.1. 初始化 != 赋值. a.初始化代表为变量分配内存. 变量在其定义处被编译器初始化(编译时). 在函数中, 函数参数初始化发生在函数调用时(运行时). b.赋值代 ...

  5. nginx日志切割

    脚本完成后将其存入 Nginx 安装目录的 sbin 中,取名为 cut-log.sh,之后使用 crontab -e 新增一个定时任务,在其中增加执行这个脚本: #!/bin/bash ## 零点执 ...

  6. 启用jboss热部署

    Please make sure to add             <configuration>                 <jsp-configuration deve ...

  7. Quartz之CronExpression

    一 Cron Expression 的格式 Quartz的cronExpression见官网文档说明: http://www.docjar.com/docs/api/org/quartz/CronEx ...

  8. (kate)win8-64位系统下opencv-2.4.3的安装以及在visual_studio2010中配置

    环境: 操作系统:window8.1 64bit Opencv版本:OPencv-2.4.3 VS版本:vs 2010 一.安装Opencv 1.Opencv官网http://opencv.org/ ...

  9. ZOJ 3329 - One Person Game

    题意:每次筛三个骰子面分别为k1,k2,k3,如果三个骰子的值分别为a,b,c则得分置0,否则得到分数加上三个骰子的值的和,如果得分大于等于n则结束游戏. 设E[i]表示当前得到i分时结束游戏的期望. ...

  10. DDOS攻击原理及防护方法论

      从 07年的爱沙尼亚DDOS信息战,到今年广西南宁30个网吧遭受到DDOS勒索,再到新浪网遭受DDOS攻击无法提供对外服务500多分钟. DDOS愈演愈烈,攻击事件明显增多,攻击流量也明显增大,形 ...