




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、天津理工大学实验报告学院(系)名称:计算机与通信工程学院姓名学号专业班级实验项目实验一:词法分析器课程名称编译原理课程代码实验时间实验地点批改意见成绩教师签字: 1、 实验内容:实现标准C语言词法分析器。2、 实验要求:(1)单词种别编码要求基本字、运算符、界符:一符一种标识符:统一为一种;常量:按类型编码;(2)词法分析工作过程中建立符号表、常量表。 并以文本文件形式输出。(3) 词法分析的最后结果以文本文件形式输出。三、实验代码:输入的程序:package com.example;public class WordList private int row;private int type;
2、private int number;private String str;public WordList() super();/ TODO Auto-generated constructor stubpublic WordList(int row, int type, int number, String str) super();this.row = row;this.type = type;this.number = number;this.str = str;public int getRow() return row;public void setRow(int row) this
3、.row = row;public int getType() return type;public void setType(int type) this.type = type;public int getNumber() return number;public void setNumber(int number) this.number = number;public String getStr() return str;public void setStr(String str) this.str = str;Overridepublic String toString() retu
4、rn "WorList row=" + row + ", type=" + type + ", number=" + number+ ", str=" + str + ""package com.example;public class Word private int row;private String string;public Word() super();/ TODO Auto-generated constructor stubpublic Word(int row, String
5、string) super();this.row = row;this.string = string;public int getRow() return row;public void setRow(int row) this.row = row;public String getString() return string;public void setString(String string) this.string = string;Overridepublic String toString() return "Word row=" + row + "
6、, string=" + string + ""package com.example;import java.io.File;import java.io.FileReader;import java.io.Reader;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class HanShu /定义符号表数组,常量表数组,关键字数组List<String> guanjianzi = Arrays.asList("double&q
7、uot;,"long","char","int","if","else","for","while","return","break","continue","switch","case","default","void","struct","static","do&q
8、uot;,"short");List<String> caozuofu = Arrays.asList("+","-","*","/","%","=",">","<","!","=","!=",">=","<=","+","-","&
9、amp;","&&","|","","");List<String> fengefu = Arrays.asList(",","","(",")","","","'",""",":","#");ArrayList<String> fuhaobiao =
10、 new ArrayList<>();ArrayList<String> changLiangBiao = new ArrayList<>();/将字符加入到符号表中public ArrayList<String> addToFuHaoBiao(String s)fuhaobiao.add(s);return fuhaobiao;/将字符串加入到常量表中public ArrayList<String> addToChangLiangBiao(String s)changLiangBiao.add(s);return changLian
11、gBiao;/判断一个字符是否是字母public boolean isLetter(char ch) if(ch>='a'&&ch<='z')|(ch>='A'&&ch<='Z')return true;elsereturn false;/判断一个字符是否是数字public boolean isDigit(char ch) if(ch>='0'&&ch<='9')return true;elsereturn fals
12、e;/读入一个文件,将其内容转换成一个字符串public String getFile(String fileName)File file = new File(fileName);String str = null;try Reader reader = new FileReader(file);char c = new char1024;int len = reader.read(c);str = new String(c, 0, len);reader.close(); catch (Exception e) e.printStackTrace();return str;/处理字符串中的
13、换行和空格public String yuChuLi(String str)String ts = ""int i;char ch,nc;for(i=0;i<str.length()-1;i+)ch = str.charAt(i);nc = str.charAt(i+1);if(ch='n')ch = '$'ts = ts+ch;else if(ch=' '|ch='t'|ch='r')if(nc=' '|nc='t'|nc='r')cont
14、inue;elsech=' '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<Word> fenGe(String str)ArrayList<Word> list
15、= new ArrayList<>();String s = ""char ch;int i;int row = 1;for(i=0;i<str.length();i+) ch=str.charAt(i); if(i=0&&ch=' ')continue;if(ch=' ')if(s!="")list.add(new Word(row,s);s = ""elsecontinue;else if(isDigit(ch)|isLetter(ch)if(s="&qu
16、ot;|isDigit(s.charAt(s.length()-1)|isLetter(s.charAt(s.length()-1)s = s + ch;elselist.add(new Word(row,s);s = ""s = s + ch;elseif(isTwoOperator(s,ch)s = s + ch;elseif(s=""&&ch!='$')s = s + ch;else if(s=""&&ch='$')row +;elselist.add(new Wo
17、rd(row, s);s = ""if(ch!='$')s = s + ch;elserow +;if(s!="")list.add(new Word(row, s);return list;/判断一个字符串是否符合规范public boolean isIdent(String str)char ch;int i;for(i=0;i<str.length();i+)ch=str.charAt(i);if(i=0&&!isLetter(ch)|(!isDigit(ch)&&!isLetter(ch)br
18、eak;if(i<str.length()return false;elsereturn true;public boolean isTwoOperator(String str, char ch) if(str.length()>1|str.length()=0)return false; elsereturn true;/将一个集合中的数据分类,判断他们是否是关键字或者是常量,亦或是标识符public ArrayList<WordList> fenlei(ArrayList<Word> arr)ArrayList<WordList> word
19、List = new ArrayList<>();for(int i = 0; i<arr.size(); i+)String str = arr.get(i).getString();int row = arr.get(i).getRow();if(isGuanJianZi(str)!=0)WordList wList = new WordList(row, isGuanJianZi(str)+1, isGuanJianZi(str), str);wordList.add(wList);else if(isFenGeFu(str)!=0)WordList list = ne
20、w WordList(row, guanjianzi.size()+isFenGeFu(str)+2, isFenGeFu(str), str);wordList.add(list);else if(isCaoZuoFu(str)!=0)WordList list = new WordList(row, guanjianzi.size()+fengefu.size()+isCaoZuoFu(str)+1, isCaoZuoFu(str), str);wordList.add(list);else if(isGuanJianZi(str)=0&&isIdent(str)WordL
21、ist list = new WordList(row, guanjianzi.size()+fengefu.size()+caozuofu.size()+1, isbiaozhifu(str), str);wordList.add(list);else if(isIdent(str)&&ischangliang(str)WordList list = new WordList(row, guanjianzi.size()+fengefu.size()+caozuofu.size()+2, isInChangLiangBiao(str), str);wordList.add(l
22、ist);return wordList;/判断一个字符串是否是操作符,若是,则返回其在编码;否则返回0public int isCaoZuoFu(String str)int i;for(i = 0; i < caozuofu.size();i+)if(caozuofu.get(i).equals(str)break;if(i<caozuofu.size()return i;elsereturn 0;/判断一个字符串是否是分割符,若是,则返回其在编码;否则返回0public int isFenGeFu(String str)int i;for(i = 0; i < feng
23、efu.size();i+)if(fengefu.get(i).equals(str)break;if(i<fengefu.size()return i;elsereturn 0;/判断一个字符串是否是关键字public int isGuanJianZi(String string) int i;for(i = 0; i < guanjianzi.size();i+)if(string.equals(guanjianzi.get(i)break;if(i<guanjianzi.size()return i+1;elsereturn 0;/判断该字符是否在常量表中存在publi
24、c int isInChangLiangBiao(String string)int i;for(i = 0; i < changLiangBiao.size();i+)if(changLiangBiao.get(i).equals(string)break;if(i<changLiangBiao.size()return i;elseaddToChangLiangBiao(string);return i+1;/判断一个字符串是否是数字或者是双引号引起来的字符常量public boolean ischangliang(String string) char a = '&q
25、uot;'String str = a+""char num = string.toCharArray();StringBuffer hire = new StringBuffer();/for(int i=0;i<string.length();i+)if(Character.isDigit(numi)hire.append(numi);if(string.endsWith(str)&&string.startsWith(str)return true;if(hire.length()=string.length()return true;e
26、lsereturn false;/判断一个字符串是否已经在字符表中存在,若不存在,则添加到字符表中public int isbiaozhifu(String string) int i;for(i = 0;i<fuhaobiao.size();i+)if(fuhaobiao.get(i).equals(string)break;if (i<fuhaobiao.size() return i;elseaddToFuHaoBiao(string);return i+1;package com.example;import java.io.FileWriter;import java.i
27、o.IOException;import java.util.ArrayList;import java.util.List;public class Main public static void outPut(ArrayList<WordList> arrayList)FileWriter writer;try writer = new FileWriter("E:/1.txt");writer.write("row:字符在其原来文件中的行数"); writer.write("rn");writer.write(&qu
28、ot;type:字符串类型(1-19表示关键字)(20-29表示分隔符)(30-49表示操作符)"+ "(50表示标识符)(51表示常量符)"); writer.write("rn"); writer.write("number:字符在其所属类型中的排列表位置"); writer.write("rn"); writer.write("str:表示该字符串"); writer.write("rn"); writer.write("rn"); for(int i=0;i<arrayList.size();i+) writer.write(arrayList.get(i).toString(); writer.write("rn"); writer.close(); catch (IOException e) e.printStackTrace(); public static void outPut(List<String> list,String fileName,int a)FileWriter writer;try writ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 软件升级及维护合同
- 交通协管员聘用合同协议书
- 家禽购销合同
- 货品抵款结算协议书
- 应对市场变化的解决方案研究
- 兰州房屋租赁合同
- 机械租赁协议合同
- 第19课 治学须有疑无疑不成学-《怀疑与学问》(教学设计)九年级语文上册同步高效课堂(统编版)
- 第一单元学习任务《如何阐述自己的观点》教学设计 2023-2024学年统编版高中语文必修下册
- Unit 4 Fun with numbers 第二课时(教学设计)-2024-2025学年外研版(三起)(2024)英语三年级上册
- JJF 1176-2024(0~2 300) ℃钨铼热电偶校准规范
- 8.4+同一直线上二力的合成课件+2024-2025学年人教版物理八年级下册
- 2024年河北省邢台市公开招聘警务辅助人员(辅警)笔试专项训练题试卷(2)含答案
- 地质灾害防治工程施工技术要点课件
- 防涉黄课件教学课件
- 家政公司服务员考试题库单选题100道及答案解析
- 人工智能:AIGC基础与应用 课件 实训项目九 使用度加创作工具和剪映进行智能化短视频创作
- 企业人才招聘与选拔方法论研究
- 《日影的朝向及长短》课件
- 中职普通话教师教案模板
- 施工后期的场地恢复措施
评论
0/150
提交评论