Java语言词法分析器的设计与实现
一.实验目的
1.强化对系统软件综合工程实现能力、规划能力的训练;
2.加强对词法分析原理、方法和基本实现技术的理解;
二.实验内容
用C语言(或 C++ )作为宿主语言完成:
其中具体要求:
1.使用DFA实现词法分析器的设计;
2.实现对Java源程序中注释的过滤;
3.利用两对半缓冲区从文件中逐一读取单词;
4.词法分析结果属性字流存放在独立文件(文件名:scanner_output)中;
5.统计源程序每行单词的个数和整个源文件单词个数;
6.具有报告词法错误和出错位置(源程序行号和该行字符)的功
注: 附Java语言词法规则 (附件一);
附Java语言词法分析器的属性字设计 (附件二)
三.实验验收与评分要求
1.编写Java语言词法分析器的源程序并调试通过;
2.通过测试程序的验收 (测试程序名称:Test-Lexcial);
3.提交简明扼要的书面实验报告。内容包括:FA设计;源程序主要函数功能;主要数据结构设计。
附件一
JAVA语言词法规则
关键字:
abstract boolean break byte case catch char class
const continue default do double else extends false
final finally float for goto if implements import
instanceof int interface long native new null package
private protected public return short static super switch
synchronized this throw throws transient true try void
volatile while
标识符:
字母或美元符号“$”或下划线开头,连接字母或美元符号“$”或下划线或数字字符的串。
常量:
整型常量: 123, 0, -456, 0123 , 0x123, -0X12,123L
实型常量: 1.23, 0.123, .123, 123., 123.0, 123e3, 123E3, 12.3F
布尔常量: true、 false
字符串常量:"This is a constant string."。
字符常量: ‘ a’ ,
转义字符描述
\ddd 1到3位8进制数据所表示的字符(ddd)
\uxxxx 1到4位16进制数所表示的字符(xxxx)
\' 单引号字符
\\ 反斜杠字符
\r 回车
\n 换行
\f 走纸换页
\t 横向跳格
\b 退格
界限符:
{ } |
花括号用于定义类、方法和本地范围的代码块。它们也用于包含自动被初始化数组的值。 |
[ ] |
方括号用于声明数组类型。同时也用于废弃数组值。 |
, |
逗号用于分隔变量声明中连续的标识符。它也用于连接语句。 |
( ) |
圆括号用于在方法定义和调用中包含参数列表。它们也用于定义表达式中的优先级,在控制语句中包含表达式,以及包含转换类型。 |
. |
点号用于分隔包名和类名。同时也用于把变量或者方法与引用变量分隔开。 |
; |
分号用于终止Java语句。 |
运算符:
操作 |
运算符 |
操作 |
运算符 |
操作 |
运算符 |
加赋值 |
+= |
大于 |
> |
乘积赋值 |
*= |
加 |
+ |
大于等于 |
>= |
非 |
! |
与赋值 |
&= |
自增1 |
++ |
非赋值 |
^= |
赋值 |
= |
左移位 |
<< |
不等于 |
!= |
按位与 |
& |
左移位赋值 |
<<= |
或赋值 |
|= |
按位取反 |
~ |
小于 |
< |
右移位 |
>> |
按位或 |
| |
小于等于 |
<= |
右移位赋值 |
>>= |
按位异或 |
^ |
逻辑与 |
& |
短路与 |
&& |
条件运算符 |
?: |
逻辑或 |
| |
短路或 |
|| |
自减1 |
-- |
逻辑异或 |
^ |
减赋值 |
-= |
除赋值 |
/= |
求模 |
% |
减 |
- |
除 |
/ |
模赋值 |
%= |
零填充右移位 |
>>> |
等于 |
== |
乘积 |
* |
零填充右移位赋值 |
>>>= |
附件二
JAVA词法分析器的属性字设计
单词属性用十六进制表示:
错误的单词 0x100
注释 0x101
空格 0x102
关键字 0x103
标识符 0x104
布尔型 0x105
字符型 0x106
整型 0x107
浮点型 0x108
字符串 0x109
= += -= *= /= %= &=
^= |= >>= <<= >>>= 0x110
?: 0x111
|| 0x112
&& 0x113
| 0x114
^ 0x115
& 0x116
== != 0x117
< > <= >= 0x118
<< >> >>> 0x119
+ - 0x11a
* / % 0x11b
++ --– ! ~ 0x11c
[ ] ( ) . 0x11d
, 0x120
{} 0x121
; 0x122