c语言词法分析器(java语言)

上传人:xzh****18 文档编号:34307433 上传时间:2018-02-23 格式:DOC 页数:23 大小:360.50KB
返回 下载 相关 举报
c语言词法分析器(java语言)_第1页
第1页 / 共23页
c语言词法分析器(java语言)_第2页
第2页 / 共23页
c语言词法分析器(java语言)_第3页
第3页 / 共23页
c语言词法分析器(java语言)_第4页
第4页 / 共23页
c语言词法分析器(java语言)_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《c语言词法分析器(java语言)》由会员分享,可在线阅读,更多相关《c语言词法分析器(java语言)(23页珍藏版)》请在金锄头文库上搜索。

1、C 语言词法分析器( JAVA 实现)【软件下载】http:/ ,很早就想整理一下,苦于没有多少时间, ,现将其中一些整理下。 。【要求】读入一源程序字符流,将其分解成词法单元序列,并完成以下语言改造功能:#标识符长度必须小于 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 i

2、nt 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 这个类的构造函数里

3、面更改或删除,并删除相关的判定函数【软件信息】名称:C 语言词法分析器版本:V1.2 RC04作者:Soulenvy【软件截图】【软件下载】http:/ 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

4、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 k

5、eyWord();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(

6、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()+

7、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)

8、;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(0

9、32 赋值运算符+ 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);/符号表操

10、作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.to

11、String()+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

12、= 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.tab

13、String() + 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

14、;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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号