Java编写的C语言词法分析器.doc_第1页
Java编写的C语言词法分析器.doc_第2页
Java编写的C语言词法分析器.doc_第3页
Java编写的C语言词法分析器.doc_第4页
Java编写的C语言词法分析器.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

这是java编写的C语言词法分析器,我将核心代码整理起来,准备放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进。这个词法分析器实现的功能有打开文件、保存文件、打开帮助文档、文本域内容的剪切和复制和黏贴、进行词法分析程序的项目结构如图,Word类和Unidentifiable类是两个JavaBean类,存放的参数有两个row(整型)、word(String),row用于获取行数,word用于获取标识符,LexerFrame是词法分析器的界面类,Analyze封装了进行词法分析的核心代码 ,doc文件夹放一个帮助文档,当用户点击帮助按钮时可以弹出来以帮助用户使用。/核心程序:package com.lexer;import java.util.ArrayList;/*120号为关键字,用下标表示,i+1就是其机器码;2140号为操作符,用下标表示,i+21就是其机器码;4160号为分界符,* 用下标表示,i+41就是其机器码;用户自定义的标识符,其机器码为51;常数的机器码为52;不可以识别的标识符,其机器码为0*/public class Analyze /关键字private String keyword=int,long,char,if,else,for,while,return,break,continue,switch,case,default,float,double,void,struct,static,do,short;/运算符private String operator=+,-,*,/,%,=,=,=0&ch=a&ch=A&ch1|str.length()=0)/字符数大于2和无字符的情况return false;else/字符数等于2的情况lc=str.charAt(str.length()-1);if(ch=&(lc=|lc=|lc=|lc=!)else if(ch=+&lc=+)else if(ch=-&lc=-)else if(ch=|&lc=|)else if(ch=&lc=&)elsereturn false;/否就返回falsereturn true;/其它符号的情况都返回true/* * 获取关键字的机器码 */public int getKeywordOpcodes(String str)int i;for(i=0;ikeyword.length;i+)if(str.equals(keywordi)break;if(ikeyword.length)return i+1;/返回关键字的机器码elsereturn 0;/* * 获取操作符的机器码 */public int getOperatorOpcodes(String str)int i;for(i=0;ioperator.length;i+)if(str.equals(operatori)break;if(ioperator.length)return i+21;/返回操作符的机器码elsereturn 0;/* * 获取分界符的机器码 */public int getDelimiterOpcodes(String str)int i;for(i=0;idelimiter.length;i+)if(str.equals(delimiteri)break;if(idelimiter.length)return i+41;/返回分界符的机器码elsereturn 0;/* * 判断字符是否可以识别 */public boolean isIdent(String str)char ch;int i;for(i=0;istr.length();i+)ch=str.charAt(i);/非数字串的情况和非由英文字母组成的字符串if(i=0&!isLetter(ch)|(!isDigit(ch)&!isLetter(ch)break;if(istr.length()return false; elsereturn true; /* * * 预处理函数 */public String preFunction(String str)String ts=;int i;char ch,nc;/这里的istr.length()-1for(i=0;istr.length()-1;i+)ch=str.charAt(i);nc=str.charAt(i+1);if(ch=n)/如果字符是换行符,将n换成$ch=$;ts=ts+ch;else if(ch= |ch=r|ch=t)if(nc= |nc=r|ch=t)continue;/连续 或者t或者r的情况,直接跳过elsech= ;/一个 或者t或者r的情况,将这些字符换成 ts=ts+ch;elsets=ts+ch;/将字符连起来ch=str.charAt(str.length()-1);if(ch!= &ch!=r&ch!=t&ch!=n)ts=ts+ch;return ts;/* * 将字符串分成一个个单词,存放在数组列表 */public ArrayList divide(String str)ArrayList list=new ArrayList();String s=;char ch;int i;int row=1;for(i=0;i=0&ch=9)return 1;/数字串if(str.length()=1)return 2;/单个字符elsereturn 3;/一个字符串/* * * 检查字符串是否为数字串,返回其机器码 */public int checkDigit(String str)int i;char ch;for(i=0;i9|ch0)break;if(istr.length()return 0;/不可识别的情况elsereturn 52;/常数/* * * 检查字符串是否为单个字符,返回其机器码 */public int checkChar(String str)if(getOperatorOpcodes(str)!=0)/操作符return getOperatorOpcodes(str);else if(getDelimiterOpcodes(str)!=0)/分界符return getDelimiterOpcodes(str);else if(isIdent(str)return 51;/用户自定义标识符的机器码elsereturn 0;/不可以被识别的标识符,机器码为0/* * * 检查字符串是否为字符串,返回其机器码 */public int checkString(String str)if(getOperatorOpcodes(str)!=0)/操作符return getOperatorOpcodes(str);else if(getKeywordOpcodes(str)!=0)/关键字return getKeywordOpcodes(str); else if(isIdent(str)return 51;/用户自定义标识符的机器码 elsereturn 0;/不可以被识别的标识符,机器码为0 /*在界面类写这个方法来调用方法/* * 词法分析 */public void doTokenizing()consoleTextArea.setText(null);ArrayList wlist=new ArrayList();ArrayList ulist=new ArrayList();String s,ts,str;Word word;int i;int opcodes=-1;int errorNum=0;int count=0;s=fileContentTextArea.getText();if(s.length()1)ts=analyze.preFunction(s);wlist=analyze.divide(ts);values=new Stringwlist.size()3;while(wlist.size()0)word=(Word)wlist.remove(0);str=word.getWord();i=analyze.check(str);switch (i) case 1:opcodes=analyze.checkDigit(str);break;case 2:opcodes=analyze.checkChar(str);break;case 3:opcodes=analyze.checkString(str);break;if(opcodes=0)Unidentifiable u=new Unidentifiable(word.getRow(), str);ulist.add(u);errorNum+;valuescount0=String.valueOf(word.getRow();valuescount1=str;valuescount2=String.valueOf(opcodes);count+;/更新表格内容DefaultTableModel model=(DefaultTableModel)table.getModel();while(model.getRowCount()0)model.removeRow(model.getRowCount()-1); model.setDataVector(values,title);table=new JTable(model);consoleTextArea.append(共有+errorNum+处错误!+n);while (ulist.size()0) int r;String st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论