




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言词法分析器(JAVA实现)【软件下载】/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 while 2标识符 注意前述的语言改造部分即可。 3常数 整数 0-9+ 识别八进制并转换 032=26 039 = 39 实数 0-9+.0-9* 4运算符 + - * / () 5分隔符$ 空格 t 换行符n 二功能扩展 1支持文本框和文件导入。 2支持符号表显示。 3支持显示分析完成的时间。 【代码注意】我已经将语言改造部分封装起来了,如果要更改和删除,可到idWord这个类的构造函数里面更改或删除,并删除相关的判定函数【软件信息】名称:C语言词法分析器版本:V1.2 RC04作者:Soulenvy【软件截图】【软件下载】/article-5146846-1.html【软件下载】/article-5146846-1.html【软件下载】/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 lenth)c = code.charAt(i);else c = 65535;i+;return c; public class Analysis private int line; private char peek;/当前字符 codeString source; Token temp;Analysis()Tag.ha.clear();TiTable();Tag.ht.clear();public void setSourceString(codeString cs)source = cs;/读取一个字符public void readch() throws IOExceptionpeek = source.getNextChar();/读取一个字符并判定 public boolean readch(char c) throws IOExceptionreadch();if(peek!= c) return false;else return true; /分析过程public void scan(MyFrame frame) throws IOExceptionboolean isRead = true;/判定下一循环是否读入字符line = 1;Tag.ht.clear();/符号表清空 frame.clearReport();frame.addReport(Line:+line+-n);for(int i=0;i8000;i+)if(isRead) readch();isRead = true;if(int)peek = 65535) break;if(peek= |peek=t|peek=$) continue;if(peek=n) line+;frame.addReport(Line:+line+-n);if(Tag.issym(peek)switch(peek)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 |: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 !: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 :if(readch(=)temp = new keyWord(=);frame.addReport(032关系运算符+ temp.toString()+n);else temp = new keyWord(: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;is.length();i+)if(s.charAt(i)=c) return true;return false;/双字符的第一个字符类型public static boolean issym(char c)String s = &|=!+-*/;int i;for(i=0;is.length();i+)if(s.charAt(i)=c) return true;return false;public static boolean iserror(char c)String s = ;int i;for(i = 0;is.length();i+)if(s.charAt(i)=c) return true;return false;/关键字集合初始化 public static void intiTable()ha.add(auto);ha.add(break;);ha.add(case);ha.add(char);ha.add(const);ha.add(continue);ha.add(default);ha.add(do);ha.add(double);ha.add(else);ha.add(enum);ha.add(extern);ha.add(false);ha.add(float);ha.add(for);ha.add(goto);ha.add(if);ha.add(int);ha.add(long);ha.add(register);ha.add(return);ha.add(short);ha.add(signed);ha.add(static);ha.add(sizeof);ha.add(struct);ha.add(switch);ha.add(true);ha.add(typedof);ha.add(union);ha.add(unsigned);ha.add(void);ha.add(volatile);ha.add(while);/判定是否是关键字public static boolean isKeyWord(String s)return ha.contains(s); /词法元素,父类public class Token public String name;public int type;public final static int INT =0;public final static int DOUBLE = 1;public final static int KEY = 2;public final static int ID = 3;public final static int ERROR =4;Token() Token(String mName,int mType) name = mName; type = mType;public String getName()return name;public String toString()return ;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(getClass() != obj.getClass() return false;Token tt = (Token)obj;if(!=&( =null|.equals(tt)return false;return true;/重写hashCode()方法 public int hashCode()int hash = 0;hash = 13*hash+( != null ? .hashCode() : 0);return hash;/整型数字class intNumber extends Tokenpublic int intValue;intNumber(int x,boolean flag)String ms = new Integer(x).toString();/语言改造1if(flag = true&ms.indexOf(8)=-1&ms.indexOf(9)=-1)int xx,i,l;l = ms.length();intValue = 0;for(i = l-1;i=0;i-)xx = ms.charAt(i) - 0;intValue += xx * Math.pow(8, l-i-1);else intValue = x;type = Token.INT;name = new Integer(intValue).toString();public String toString()return ;/浮点数class floatNumber extends Tokenpublic double dValue;floatNumber(double x)name = new Float(x).toString();type = Token.DOUBLE;dValue = x;public String toString()return ;/关键字class keyWord extends Tokenpublic String key;keyWord(String x)name = x;type = Token.KEY;key = x;public String toString()return ;/标识符class idWord extends Tokenpublic String id;public int state;idWord(String x)id = x;state = checkIllegal(x);if(state 0) type = Token.ERROR;else type = Token.ID;switch(state)case 0:name = deleteLine(x);break;case 1:name = 标识符长度大于20;break;case 2:name = 标识符首字符为下划线; break;case 3:name = 标识符存在连续的下划线字符; break;public String toString()if(state 0)return error(+state+):+id+-+name;return ; /语言改造2private int checkIllegal(String x)if(x.length()20) return 1;if(x.charAt(0) = _) return 2;int i;for(i = 1;ix.length();i+)if(x.charAt(i) = _&x.charAt(i-1) = _)return 3;return 0;/语言改造3private static String deleteLine(String x)StringBuffer sb = new StringBuffer(x);int i;for(i = 0;i sb.length();i+)if(sb.charAt(i) = _)sb.deleteCharAt(i);sb.deleteCharAt(i-1);return new String(sb);-界面设计类 package part1;import java.awt.*;import java.awt.event.*;import java.io.*;import javax.swing.*;SuppressWarnings(serial)public class MyFrame extends JFrame implements ActionListener/* * */public Analysis ana = new Analysis();/菜单栏,北区JMenuBar jm = new JMenuBar();JMenu startMenu = new JMenu(开始);JMenu runMenu = new JMenu(运行);JMenu optionMenu = new JMenu(选项);JMenuItem openItem = new JMenuItem(打开);JMenuItem saveItem = new JMenuItem(保存);JMenuItem clearItem = new JMenuItem(清除);JMenuItem quitItem = new JMenuItem( 退出);JMenuItem analyItem = new JMenuItem(分析);JMenuItem optionItem = new JMenuItem(配置);JMenuItem helpItem = new JMenuItem(帮助);JMenuItem aboutItem = new JMenuItem(关于);/按钮面板,南区JButton jb = new JButton(打开),new JButton(清除),new JButton(保存),new JButton(分析),new JButton(退出);JPanel buttonJPane = new JPanel(new FlowLayout();/选项卡0,西区JTabbedPane jtab0 = new JTabbedPane();JTextArea sourceTextArea = new JTextArea(19,35);JScrollPane sourceJSP = new JScrollPane(sourceTextArea);/选项卡1,东区JTabbedPane jtab1 = new JTabbedPane(SwingConstants.TOP);JTextArea reportTextArea = new JTextArea(,19,35);JTextArea tableTextArea = new JTextArea(,19,35);JTextArea ruleTextArea = new JTextArea(,19,35);JScrollPane reportJSP = new JScrollPane(reportTextArea);JScrollPane tableJSP = new JScrollPane(tableTextArea);JScrollPane ruleJSP = new JScrollPane(ruleTextArea);MyFrame()this.setTitle(C语言词法分析器v1.3.0);this.setLayout(new BorderLayout();this.setBounds(100, 100, 840, 520);this.setResizable(false);/菜单栏设计,北区startMenu.add(openItem);openItem.addActionListener(this);startMenu.add(saveItem);saveItem.addActionListener(this);startMenu.add(quitItem);quitItem.addActionListener(this);runMenu.add(clearItem);clearItem.addActionListener(this);runMenu.add(analyItem);analyItem.addActionListener(this);optionMenu.add(optionItem);optionMenu.add(helpItem);helpItem.addActionListener(this);optionMenu.add(aboutItem);aboutItem.addActionListener(this);jm.add(startMenu);jm.add(runMenu);jm.add(optionMenu);this.add(jm,BorderLayout.NORTH);/按钮设计,南区for(int i = 0;ijb.length;i+)buttonJPane.add(jbi);jbi.addActionListener(this);this.add(buttonJPane,BorderLayout.SOUTH);/源程序输入,西区jtab0.add(源程序,sourceJSP);this.add(jtab0,BorderLayout.WEST);/结果输出,东区reportTextArea.setEditable(false);tableTextArea.setEditable(false);ruleTextArea.setEditable(false);jtab1.add(分析报告,reportJSP);jtab1.add(符号表, tableJSP);jtab1.add(帮助,ruleJSP);this.add(jtab1,BorderLayout.EAST);this.loadRuleFile();this.setVisible(true);/响应按钮和菜单事件public void actionPerformed(ActionEvent e)Object thissource = e.getSource();if(thissource instanceof JButton)/按钮响应JButton thisjb = (JButton)thissource;if(thisjb =jb0)/打开this.openFile();else if(thisjb =jb1)/清除this.clearContent();else if(thisjb =jb2)/保存this.saveFile();else if(thisjb =jb3)/分析this.analysis();else if(thisjb =jb4)/退出this.quitPragram();else if(thissource instanceof JMenuItem)/菜单项响应JMenuItem thisjt = (JMenuItem)thissource;if(thisjt = aboutItem)/关于String s = 版本:V1.3.0n作者:SoulenvynQQ:729636330;JOptionPane.showMessageDialog(this,s,软件信息,JOptionPane.INFORMATION_MESSAGE);else if(thisjt = openItem)/打开this.openFile();else if(thisjt = clearItem)/清除this.clearContent();else if(thisjt = quitItem)/退出this.quitPragram();else if(thisjt = saveItem)/保存this.saveFile();else if(thisjt = helpItem)/帮助jtab1.setSelectedIndex(2);else if(thisjt = analyItem)/分析this.analysis();/打开文件public void openFile()String sss;FileDialog fd = new FileDialog(this,打开文件,FileDialog.LOAD);fd.setDirectory(System.getProperty(c:);fd.setVisible(true);trysourceTextArea.setText();if(fd.getFile() != null)File myFile = new File(fd.getDirectory(),fd.getFile();InputStream is = new FileInputStream(myFile);InputStreamReader isr = new InputStreamReader(is,gb2312);BufferedReader bf = new BufferedReader(isr);String temp = null;sss = myFile.getAbsolutePath();sourceTextArea.append(sss + n);while(temp = bf.readLine() != null)sourceTextArea.append(temp + n);bf.close();catch(IOException ioe)JOptionPane.showMessageDialog(this, 文件读
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025电缆租赁合同范本
- 2025年解除劳动合同协议书下载
- 医院入股协议合同范本
- 车辆贷款的合同范本
- 商铺抵款合同范本
- 租赁协议车位合同范本
- 测绘协议合同范本
- 2025电商联销合同
- 饮品代理加盟合同范本
- 租公寓房合同范本
- 安踏集团零售管理培训手册
- 吉林大学《计算机网络(双语)》2021-2022学年期末试卷
- 《解除保护性止付申请书模板》
- 2024年云网安全应知应会考试题库
- 风电场投资财务模型构建
- 高层建筑火灾扑救
- 南京大学介绍
- DL-T-255-2012燃煤电厂能耗状况评价技术规范
- 【视频号运营】视频号运营108招
- 幼儿园拍摄技巧培训
- (正式版)JBT 14682-2024 多关节机器人用伺服电动机技术规范
评论
0/150
提交评论