《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