编译原理 实验一 词法分析
一、实验目的
编制一个词法分析程序,加深对词法分析原理的理解
二、实验要求
1.待分析的简单的词法
(1)关键字:
begin if then while do end
注:所有的关键字都是小写。
(2)运算符和界符
. + - * / = <> < <= > >= ( ) ; :=
(3)其他单词是标识符(IDENT)和整型常数(NUMBER),通过以下正规式定义:
IDENT ::= letter (letter | digit)*
NUMBER ::= digit digit*
注:所有的IDENT和NUMBER的长度不超过20
(4)空格有空白、制表符和换行符组成。空格一般用来分隔IDENT、NUMBER、运算符、界符和关键字,词法分析阶段通常被忽略。整个程序串长度不超过80个字符。
2. 各种单词符号对应的类别值:
表 各种单词符号对应的类别码
单词符号 是否保留字 枚举值 类别码
单词符号 | 是否保留字 | 枚举值 | 类别码 |
. | period | 0 | |
+ | plus | 1 | |
- | minus | 2 | |
* | times | 3 | |
/ | slash | 4 | |
= | eql | 5 | |
<> | neq | 6 | |
< | lss | 7 | |
<= | leq | 8 | |
> | gtr | 9 | |
>= | geq | 10 | |
( | lparen | 11 | |
) | rparen | 12 | |
; | semicolon | 13 | |
:= | becomes | 14 | |
begin | Y | beginsym | 15 |
end | Y | endsym | 16 |
if | Y | ifsym | 17 |
then | Y | thensym | 18 |
while | Y | whilesym | 19 |
do | Y | dosym | 20 |
IDENT | ident | 21 | |
NUMBER | number | 22 | |
示例:
源程序: begin x:=9;if x<10 then x:=(x+10)*2 end.
经过词法分析后输出如下序列:(15,begin)(21,x)(14,:=)(22,9)(13,?……
4. 词法分析程序的设计
1)词法分析识原理采用状态转换图方法:
三、实验说明
1、程序中的关键变量,识别示例
2、Symbol: 自定义的enum枚类类型,定义了程序中所有单词符号及其对应类别码。
- 获得某个字符串(例:begin)的单词符号类型
假设strToken= “begin”,则:
一种方法是直接赋值:sym=symbol.beginsym;
另一种方法是通过getType函数:symbol.getType(strToken.concat(“sym”)); - 获得某sym的类别码,则可以访问其成员变量sym.iIndex。
代码
package lex;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class lex {
//单词符号类别定义,与实验的表格要求一致
public enum symbol {
period(".",0), plus("+",1), minus("-",2), times("*",3), slash("/",4),
eql("=",5), neq("<>",6), lss("<",7), leq("<=",8), gtr(">",9),
geq(">=",10), lparen("(",11), rparen(")",12), semicolon(";",13), becomes(":=",14),
beginsym("begin",15), endsym("end",16), ifsym("if",17), thensym("then",18),
whilesym("while",19), dosym("do",20), ident("IDENT",21), number("number",22),
nil("nil",23), kong(" ",24);
private String strName;
private int iIndex;
private symbol(String name, int index)
{