资源预览内容
第1页 / 共23页
第2页 / 共23页
第3页 / 共23页
第4页 / 共23页
第5页 / 共23页
第6页 / 共23页
第7页 / 共23页
第8页 / 共23页
第9页 / 共23页
第10页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
C 语言词法分析器( JAVA 实现)【软件下载】http:/soulenvy.lingdi.net/article-5146846-1.html这是上学期编译实践的一个题目,已经写了四五个月了(大约是十月份开始写的) ,很早就想整理一下,苦于没有多少时间, ,现将其中一些整理下。 。【要求】读入一源程序字符流,将其分解成词法单元序列,并完成以下语言改造功能:#标识符长度必须小于 20;#不允许出现连续两个以上的下划线;#出现单个下划线时,应连同其前的一个字符一同删除,如 as_df = adf,r_sd_d_dfg = sdfg。【功能描述】一识别的类型1 基本保留字auto break case char const continue default do double else enum extern float for goto if int long register return short signed static sizeof struct switch typedef union unsigned void volatile while2 标识符注意前述的语言改造部分即可。3 常数整数 0-9+ 识别八进制并转换 032=26 039 = 39实数 0-9+.0-9*4 运算符+ - * / () 5 分隔符$ 空格 t 换行符 n二功能扩展1 支持文本框和文件导入。2 支持符号表显示。3 支持显示分析完成的时间。 【代码注意】我已经将语言改造部分封装起来了,如果要更改和删除,可到 idWord 这个类的构造函数里面更改或删除,并删除相关的判定函数【软件信息】名称:C 语言词法分析器版本:V1.2 RC04作者:Soulenvy【软件截图】【软件下载】http:/soulenvy.lingdi.net/article-5146846-1.html【软件下载】http:/soulenvy.lingdi.net/article-5146846-1.html【软件下载】http:/soulenvy.lingdi.net/article-5146846-1.html全部代码:主类 main 函数入口package part1;public class Lexer /* param args* author Soulenvy*/public static void main(String args) / TODO Auto-generated method stubSuppressWarnings(unused)MyFrame frame = new MyFrame();分析器类package part1;import java.io.*;/代码字符串class codeStringprivate String code;/源代码private int i;/指针private int lenth;/长度private char c;/当前字符codeString(String s)code = s;i = 0;lenth = code.length();public char getNextChar()if(i :if(readch(=) temp = new keyWord(=);frame.addReport(032 关系运算符+ temp.toString()+n);else temp = new keyWord();frame.addReport(032 关系运算符+ temp.toString()+n);isRead = false;break;case +:readch();if(peek = =) temp = new keyWord(+=);frame.addReport(032 复合运算符+temp.toString()+n);else if(peek = +)temp = new keyWord(+);frame.addReport(032 自增运算符+temp.toString()+n);else temp = new keyWord(+);frame.addReport(032 加法运算符+ temp.toString()+n);isRead = false;break;case -:readch();if(peek = =)temp = new keyWord(-=);frame.addReport(032 复合运算符+temp.toString()+n);else if(peek = -)temp = new keyWord(-);frame.addReport(032 自减运算符+temp.toString()+n);else temp = new keyWord(-);frame.addReport(032 减法运算符+temp.toString()+n);isRead = false;break;case *:if(readch(=)temp = new keyWord(*=);frame.addReport(032 复合运算符+temp.toString()+n);elsetemp = new keyWord(*);frame.addReport(032 乘法运算符+ temp.toString()+n);isRead = false;break;case /:readch();if(peek = =) temp = new keyWord(/=);frame.addReport(032 复合运算符+temp.toString()+n);else if(peek = /)doreadch();if(peek = n) break;while(true);isRead = false;else temp = new keyWord(/);frame.addReport(032 除法运算符+ temp.toString()+n);isRead = false;break;case =:if(readch(=)temp = new keyWord(=);frame.addReport(032 逻辑运算符+ temp.toString()+n);else temp = new keyWord(=);frame.addReport(032 赋值运算符+ temp.toString()+n);isRead = false;break;if(Character.isDigit(peek)boolean flag = false;int v = 0;if(peek = 0) flag=true;dov = 10*v + Character.digit(peek, 10);readch();while(Character.isDigit(peek);if(peek != .) temp = new intNumber(v,flag);frame.addReport(032 整型数字+temp.toString()+n);/符号表操作if(!Tag.ht.contains(temp)Tag.ht.add(temp);int size = Tag.ht.size();frame.addTable(size +032+ temp.tabString() + n);else float x = v;float d = 10;for(;)readch();if(!Character.isDigit(peek) break;x = x + Character.digit(peek,10)/d;d = d * 10;temp = new floatNumber(x);frame.addReport(032 浮点数字+ temp.toString()+n);/符号表操作if(!Tag.ht.contains(temp)Tag.ht.add(temp);int size = Tag.ht.size();frame.addTable(size +032+ temp.tabString() + n);isRead = false;if(Character.isLetter(peek)|peek=_)StringBuffer b = new StringBuffer();dob.append(peek);readch();while(Character.isLetterOrDigit(peek)|peek=_);String s = b.toString();if(Tag.isKeyWord(s)temp = new keyWord(s);frame.addReport(032 关键字+ temp.toString()+n);elsetemp = new idWord(s);frame.addReport(032 标识符+temp.toString()+n);/符号表操作if(!Tag.ht.contains(temp)&temp.type !=Token.ERROR)Tag.ht.add(temp);int size = Tag.ht.size();frame.addTable(size +032+ temp.tabString() + n);isRead = false;if(Tag.isdot(peek)String tmp = new Character(peek).toString(); Token tok = new Token(tmp,0); frame.addReport(032 符号+tok.toString()+n);isRead = true;if(Tag.iserror(peek)frame.addReport(error(4):+peek+-+非法字符+n);/end for/end scan词法单元定义类package part1;import java.util.HashSet;class Tag/关键字集合public static HashSet ha = new HashSet();/符号表集合public static HashSet ht = new HashSet();/判定单字符类型public static boolean isdot(char c)String s = #%();:?,.;int i;for(i=0;i+-*/;int i;for(i=0;i;public String tabString()String s = null;if(type = Token.INT)s = num;if(type = Token.ID)s = id;if(type = Token.DOUBLE)s = num;return s +t+ name;/重写 equals()方法public boolean equals(Object obj)if(obj = null) return false;if
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号