JavaCC学习笔记 -- by greatdino
[ 大恐龙 发表于 2007年5月 3日 18:34 ]
JavaCC是一个java语言分析器,就是按照“模版”,“装配”不同的语言分析程序的源代码。复杂语言的语法通常都是使用 BNF(巴科斯-诺尔范式,Backus-Naur Form)表示法或者其“近亲”― EBNF(扩展的 BNF)描述的。自动化工具可以使用那些描述(我将使用通用的术语 BNF来指代这两种变体)或与它们近似的描述来为你生成解析代码。
这个例子可以在javacc-4.0/doc/examples/SimpleExamples/Simple1.jj看到
......
PARSER_BEGIN(Simple1)
public class Simple1 {
public static void main(String args[]) throws ParseException {
Simple1 parser = new Simple1(System.in);
parser.Input();
}
}
PARSER_END(Simple1) void Input() : {} {
MatchedBraces() ("\n"|"\r")*
}
void MatchedBraces() : {} {
"{" [ MatchedBraces() ] "}" }
......
设置好javacc的bin目录后,在命令提示符下输入
javacc Simple1.jj
然后javacc就会为你生成下面几个java源代码文件
Simple1.java
Simple1TokenManager.java
Simple1Constants.java
SimpleCharStream.java
Token.java
TokenMgrError.java
JavaCC的输入文档是一个词法和语法的规范文件,其中也包括一些动作的描述,它的后缀应该是jj。
简而言之,一个jj文档由下面几个部分构成:
1、Options{}部分:这个部分对产生的语法分析器的特性进行说明,例如向前看的token的个数(用来解除冲突)。这一部分是可以省略的,因为每一个选项都有默认值,当我们没有对某个选项进行说明时,它就采用默认值。也可以把这些选项作为javacc命令的参数来启动javacc,可以达到同样的效果。
2、分析器类的声明:这个部分指定了分析器类的名字,以及其他类中成员的声明。这个部分是必须有的。这个部分的声明如下:
PARSER_BEGIN(classname)
Class classname {
……
}
PARSER_END(classname)
3、词法部分声明:这里面有四类:SKIP、TOKEN、SPECIAL_TOKEN、MORE。其中,SKIP用来说明被忽略的串,下面是一个例子:
SKIP {
“ “
|
“\n”
|
“\r”
}
TOKEN用来说明在词法层次上识别的token,下面是一个例子:
TOKEN {
<ID: (“a”-“z”|”A”-“Z”)+>
|
<NUM: (“0”-“9”)+>
}
这个部分是可以省略的。
4、在词法声明部分,以#开头的token只是在词法分析时使用,不能作为语法分析的输入,也就是说,它相对词法分析是局部的。
5、语法声明和动作代码:这一部分生成的代码会直接插入分析器类声明的结束括号之前。一般而言,语法中的每一个非终结符都对应一个函数,其中函数的形式如下:
Return_type function_name()
{变量声明和一些初始化的动作}
{上下文无关文法的右部分,其中每个组成部分的形式如下:
语法部分 {动作部分}
两个部分都可以省略。语法部分可以是一个字符串(简单的token常常可以这样处理),TOKEN中声明的token,或一个对某个非终结符对应的函数的调用。
}
以上说明的是jj文件的组成部分,下面再说明一下jj文件中语法的表示方法。Javacc中的语法表示吸收了UNIX中正规文法的一些记号,下面是一些:
[]:其中的内容是可选的。
+:前面的内容出现一次或多次。
-:前后构成的闭区间。
*: 前面的内容出现0次或多次。
?:前面的内容出现0次或一次。
~:后面的内容的补。
|:前面或后面。
():改变运算的优先级,把其中的内容作为一个整体。
ASCII 编码, 存个档
[ 大恐龙 发表于 2007年5月22日 16:48 ]
ASCII 编码
数字代表计算机的语言。您的计算机如何使用字母来与程序和其他计算机进行通信?一种方法是把字符集 (字符集:一组共享一些关系的字母、数字和其他字符。例如,标准 ASCII 字符集包括字母、数字、符号和组成 ASCII 代码方案的控制代码。)转换为数字形式。
在 20 世纪 60 年代,标准化的需要带来了美国标准信息交换码 (ASCII) (ASCII:将英语中的字符表示为数字的代码。为每个字符分配一个介于 0 到 127 之间的数字。大多数计算机都使用 ASCII 表示文本和在计算机之间传输数据。)(发音为 ask-kee)。ASCII 表包含 128 个数字,分配给了相应的字符 (字符:字母、数字、标点或符号。)。ASCII 为计算机提供了一种存储数据和与其他计算机及程序交换数据的方式。
ASCII 非打印控制字符
ASCII 表上的数字 0–31 分配给了控制字符,用于控制像打印机等一些外围设备。例如,12 代表换页/新页功能。此命令指示打印机跳到下一页的开头。
ASCII 非打印控制字符表
| 进制 | 字符 | 进制 | 字符 | |||
|---|---|---|---|---|---|---|
| 0 | 00 | 空 | 16 | 10 | ||
| 1 | 01 | 头标开始 | 17 | 11 | ||
| 2 | 02 | 正文开始 | 18 | 12 | ||
| 3 | 03 | 正文结束 | 19 | 13 | ||
| 4 | 04 | 传输结束 | 20 | 14 | ||
| 5 | 05 | 查询 | 21 | 15 | ||
| 6 | 06 | 确认 | 22 | 16 | ||
| 7 | 07 | 震铃 | 23 | 17 | ||
| 8 | 08 | backspace | 24 | 18 | ||
| 9 | 09 | 水平制表符 | 25 | 19 | ||
| 10 | 0A | 换行/新行 | 26 | 1A | ||
| 11 | 0B | 竖直制表符 | 27 | 1B | ||
| 12 | 0C | 换页/新页 | 28 | 1C | ||
| 13 | 0D | 回车 | 29 | 1D | ||
| 14 | 0E | 移出 | 30 | 1E | ||
| 15 | 0F | 移入 | 31 | 1F |













![[Valid RSS]](http://www.w3cool.com//images/valid-rss.png)
![Validate my Atom 1.0 feed [Valid Atom 1.0]](http://www.w3cool.com//images/valid-atom.png)






[卓越网] 于 08-12-22 发表: 博主您的博客挺不错的, 可否做个链接? 我那边做好了~ 我的博客是 大恐龙
[购买] 于 08-12-21 发表: 很喜欢这个功能,但是我加入代码还是不能用,是不是有限制呢? 我自己有服务器,可否购买你的软件,我自...
[大恐龙
[linuxes] 于 08-12-13 发表: 请问wordpress里面怎么用?...
[游客] 于 08-12-13 发表: 原来乌班图免费光盘是这样子的 看看就好 索取的人多了 估计要垮掉 不忍心啊...
[大恐龙
[renm79] 于 08-12-11 发表: 今天看了你的文章非常有启发,然后照着文章去试了一试,发现几个不明白的地方,还请赐教。1)直接按你说的...
[hanyu] 于 08-12-10 发表: 没办法.现在网站广告的投放各大媒体都声称自己的可以流量和点击及视频播放可以达到什么程度.其实都是在用...
[大恐龙
[hanyu] 于 08-12-08 发表: 现在ICAST已经减少了前面那种的富媒体投放形式而转为使用MPU中FLASH钳套新的FLASH或视频...
[大恐龙
[tanguan] 于 08-12-04 发表: 老是语音服务忙,怎么办?...
[443205231@qq.com] 于 08-11-28 发表: 这个功能太爽了!!...