用JAVA实现的Pascal语言的词法分析器

时间:2019-05-14 02:12:10下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《用JAVA实现的Pascal语言的词法分析器》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《用JAVA实现的Pascal语言的词法分析器》。

第一篇:用JAVA实现的Pascal语言的词法分析器

import java.io.*;public class WordAnalyse { static char[] strbuf = new char[150];//定义一个数组,用以存放从文件读取来的字符串

int keywordIndex;//取关键字的类号

String[] keyWord = {“and”,“begin”,“const”,“div”,“do”,“else”,“end”,“function”,“if”,“integer”,“not”,“or”,“procedure”,“program”, “read”,“real”,“then”,“type”,“var”,“while”,“write”};public static void main(String[] args)throws IOException {

WordAnalyse wa = new WordAnalyse();

wa.readFile(“d:/pascal.txt”);System.out.println(“******用JAVA实现的Pascal语言的词法分析器*********”);

System.out.println(“******The Result:******”+“n”);

wa.run();

System.out.println(“n”+“******Complete!******”);}

//从文件中把字符串读取到一个字符数组中

private void readFile(String url)throws IOException{

int ch,i=0;

FileReader fr = new FileReader(url);

while((ch=fr.read())!=-1){

strbuf[i++]=(char)ch;

} }

private boolean isLetter(char ch){

if('a'<=ch&ch<='z'||'A'<=ch&ch<='Z')

return true;

else return false;}

private boolean isDigit(char ch){

if('0'<= ch&&ch<='9')

return true;

else return false;}

private void run(){ //分析整个strbuf里的字符串

StringBuffer buf = new StringBuffer();//定义一个缓冲区

for(int i=0;i

//当读头读到spaceenterline的时候,忽略!

if(strbuf[i]==' '||strbuf[i]=='t'||strbuf[i]=='n')

i++;

if(isLetter(strbuf[i])){

int k;

buf.delete(0, buf.length());

while(isLetter(strbuf[i])||isDigit(strbuf[i])){

buf.append(strbuf[i]);

i++;

}

i--;

//查找buf里面的字符串是否为关键字

for(k =0;k

if(new String(buf).equals(keyWord[k])){

keywordIndex = k;

System.out.println(buf + “tt” +keywordIndex);

break;

}

}

if(k>20)

System.out.println(buf + “tt” +21);

}

if(isDigit(strbuf[i])){ 1

buf.delete(0, buf.length());

while(isDigit(strbuf[i])){

buf.append(strbuf[i]);

i++;

}

i--;

System.out.println(buf + “tt” +22);}

} } 2 } switch((char)strbuf[i]){ case',':System.out.println(strbuf[i] + “tt” + 23);break;case';':System.out.println(strbuf[i] + “tt” + 24);break;case'.':System.out.println(strbuf[i] + “tt” + 26);break;case'(':System.out.println(strbuf[i] + “tt” + 27);break;case')':System.out.println(strbuf[i] + “tt” + 28);break;case'[':System.out.println(strbuf[i] + “tt” + 29);break;case']':System.out.println(strbuf[i] + “tt” + 30);break;case'+':System.out.println(strbuf[i] + “tt” + 34);break;case'-':System.out.println(strbuf[i] + “tt” + 35);break;case'=':System.out.println(strbuf[i] + “tt” + 38);break;case':':{ buf.delete(0, buf.length());buf.append(strbuf[i]);i++;if(strbuf[i]=='='){

buf.append(strbuf[i]);

System.out.println(buf + “tt” + 44);} else{

System.out.println(buf + “tt” + 25);i++;}

};break;case'>':{ buf.delete(0, buf.length());buf.append(strbuf[i]);i++;if(strbuf[i]=='='){

buf.append(strbuf[i]);

System.out.println(buf + “tt” + 43);} else{

System.out.println(buf + “tt” + 40);i--;} };break;case'<':{ buf.delete(0, buf.length());buf.append(strbuf[i]);i++;if(strbuf[i]=='='){

buf.append(strbuf[i]);

System.out.println(buf + “tt” + 42);i++;} else if(strbuf[i]=='>'){

buf.append(strbuf[i]);

System.out.println(buf + “tt” + 41);i++;} else{

System.out.println(buf + “tt” + 39);i++;} };break;

}//switch结束

第二篇:实验一词法分析器的设计与实现

实验一词法分析器的设计与实现

一、实验目的1.了解并掌握词法分析器的原理及工作过程

2.理解词法分析器的状态图表示方法

二、实验内容

用适当的程序设计语言编制一个词法分析程序,并完成相应的调试,要求该程序能够从指定的文件中读入源程序,并将此源程序变成语义等价的单词序列,输出单词序列。

提示:

1.源程序可限定为某个语言的子语言,如C语言的子集,允许源程序中有注释行,其中的关键字自行设定,可参见书66页的编码表,保留字表为词法分析器已知的表格(可采用二维数组的形式存储)

2.参考程序见书中104-105页,程序中涉及的gettoken()和install_id()两个过程的解释见91页上面3段的说明。

3.词法分析器的输入输出示例:

输入:if(i>10)then i=0

输出:

(10, if)

(20,()

(50,i)

(21,>)

(51,10)

(22,))

(11,then)

(50,i)

(23,=)

(51,0)

其中:50代表标识符的编码,51代表常量的编码

第三篇:《编译原理》课程设计报告--词法分析器

201X-201X学年第x学期

《编译原理》课程设计报告

院 系: 计算机科学与技术 班 级: XX级XX 班 学生姓名: XXXXXX 学 号: XXXXXXXX 指导老师: XXXXXX

计算机科学与技术学院监制

20XX年X月

目录

1.课程设计的目的 2.课程设计的内容和要求 3.问题分析和相关知识介绍 4.设计思路和关键问题及其解决方案 5.测试和结果分析 6.总结和心得体会

附件1:参考文献 附件2:核心源代码

1.课程设计的目的(1)编写词法分析器

(2)加深对词法分析器工作原理的了解和认识

2.课程设计的内容和要求

编写词法分析器,词法分析器能够识别关系算符,词法分析器能够识别标识符和关键字,词法分析器能够识别无符号数。

3.问题分析和相关知识介绍

构成词法分析器的一种简单方法是用状态转换图来描述源语言词法记号的结构,然后手工把这种状态转换图翻译成为识别词法记号的程序。词法分析器的任务是把构成源程序的字符流翻译成词法记号流。

4.设计思路和关键问题及其解决方案

把自然语言构造成正规式,把正规式构造成有限自动机NFA,然后根据子集构造法把有限自动机构造成无限自动机DFA,根据极小化DFA状态数算法把DFA构造成最简DFA,其次根据最简DFA画出转换表,根据转换表画出装换图,最后根据装换图就可以编写词法分析器。

5.测试和结果分析

6.总结和心得体会

通过本次试验,不仅仅是我学会了C#基础知识,而且还是我对词法分析器有了更深入的认识,虽然在编写词法分析器过程中遇到了很多困难,例如:C#语言不熟悉,对此法分析器的工作原理分析的不透彻,但在老师和同学的帮助下,我有了很大的提高,通过不断的努力最终顺利的完成了课程设计,很感谢帮助我的XX同学和XX老师。附件1:参考文献

《编译原理(第2版)》 高等教育出版社; 《C#程序设计及应用教程(第2版)》 人民教育出版社。附件2:

1.Code文档截图

2.程序源代码

using System;using System.Collections.Generic;using System.Text;using System.IO;

namespace LexicalAnalysis { class Program { static string[] keys = { “static”, “true”, “return”, “string”, “Length”, “break”, “Console”, “WriteLine”, “bool”, “false”, “ture”, “void”, “if”, “else”, “while”, “int”, “float”, “for”, “enum”, “default”, “case”, “double”, “do” };

static List key = new List();//保存关键字

static List bsf = new List();//保存标识符

static List sz = new List();//保存数字

static List gx = new List();//保存关系运算符

static List ys = new List();//保存数字运算符

//数字,标识符,空白,关系符,运算符

static void Main(string[] args){

string[] date = File.ReadAllLines(@“d:code.txt”);//路径,并存入data

for(int i = 0;i < date.Length;i++){ Console.WriteLine(“第” +(i + 1)+ “行code: ” + date.GetValue(i));analysisByLine(date[i]);

} //分别输出存储在四个List中的String

Console.WriteLine(“关键字,输入回车”);//输出所有的关键字 Console.ReadLine();

foreach(string id in key){ Console.WriteLine(id);

}

Console.WriteLine(“标识符,输入回车”);//输出所有的标识符

Console.ReadLine();foreach(string id in bsf){ Console.WriteLine(id);

}

Console.WriteLine(“数字,输入回车”);Console.ReadLine();foreach(string id in sz){ Console.WriteLine(id);

}

Console.WriteLine(“关系运算符,输入回车”);Console.ReadLine();foreach(string id in gx){ Console.WriteLine(id);

}

Console.WriteLine(“算数运算符,输入回车”);Console.ReadLine();foreach(string id in ys){ Console.WriteLine(id);

}

Console.WriteLine(“输入回车退出”);

Console.ReadLine();

} static void analysisByLine(string code)

//输出所有的数字 //输出所有的关系运算符//输出所有的算数运算符

{

char a = ' ';string temp = “";int j = 0;while(j < code.Length){ a = code[j];temp = ”“;if(Char.IsLetter(a)|| a == '_')//是否为标识符 { temp = temp + a.ToString();j++;a = code[j];while(Char.IsLetterOrDigit(a)){ temp = temp + a.ToString();j++;a = code[j];} if(isKey(temp)){

//Console.WriteLine(”保留字:“+temp);

if(!key.Contains(temp)){ // Console.WriteLine(”添加成功“);key.Add(temp);}

} else {

//Console.WriteLine(”标识符:“+temp);

if(!bsf.Contains(temp)){ //Console.WriteLine(”添加成功标识符==“);bsf.Add(temp);} }

} else if(Char.IsDigit(a)){ temp = temp + a.ToString();j++;a = code[j];while(Char.IsDigit(a)){ temp = temp + a.ToString();j++;a = code[j];

} //判断是否是小数

if(a.Equals('.')){ temp = temp + a.ToString();j++;a = code[j];while(Char.IsDigit(a)){ temp = temp + a.ToString();j++;a = code[j];} //判读是否是科学记数法

if(a.Equals('E')|| a.Equals('e')){ temp = temp + a.ToString();j++;a = code[j];while(Char.IsDigit(a)){

temp = temp + a.ToString();j++;a = code[j];} }

}

// Console.WriteLine(”数字:“+temp);if(!sz.Contains(temp)){ //Console.WriteLine(”添加成功标识符==“);sz.Add(temp);} } else if(a == '<'){ temp = temp + a.ToString();j++;a = code[j];if(a == '='){ temp = temp + a.ToString();j++;a = code[j];} else if(a == '>'){ temp = temp + a.ToString();j++;a = code[j];} //Console.WriteLine(”关系符“+temp);if(!gx.Contains(temp)){ //Console.WriteLine(”添加成功标识符==“);gx.Add(temp);} } else if(a == '='){ temp = temp + a.ToString();j++;

a = code[j];// Console.WriteLine(”关系符“+temp);if(!gx.Contains(temp)){ //Console.WriteLine(”添加成功关系==“);gx.Add(temp);} } else if(a == '>'){ temp = temp + a.ToString();j++;a = code[j];if(a == '='){ temp = temp + a.ToString();j++;a = code[j];}

// Console.WriteLine(”关系符“+temp);if(!gx.Contains(temp)){ //Console.WriteLine(”添加成功标识符==“);gx.Add(temp);}

} else { if(a == '+' || a == '-' || a == '/' || a == '*'){ temp = temp + a.ToString();j++;a = code[j];//Console.WriteLine(”运算符“+temp);if(!ys.Contains(temp)){ //Console.WriteLine(”添加成功标识符==“);ys.Add(temp);} } else

{ j++;}

} } }

//判断是不是保留字的IsKey方法

static bool isKey(string key){

bool flag = false;for(int i = 0;i < keys.Length;i++)

if(keys[i] == key){ flag = true;//Console.WriteLine(key+”是不是key“+flag);break;} else { flag = false;

} //Console.WriteLine(key+”是不是key“);// Console.WriteLine(flag+”是不是key");return flag;

} } }

第四篇:编译原理实验二(设计一个词法分析器)

编译原理实验二

1.实验名称:一个简单语言词法分析器设计

2.实验内容

(1)阅读并理解教材第三章词法分析p42“简单语言”词法分析构造实例

(2)完善P45给出的“简单语言”词法分析程序,使得该程序能够在计算机上运行,完

全达到词法分析器的设计基本要求:

① 读入“简单语言”源程序

②滤掉“简单语言”源程序中的“空白”字符

③滤掉“简单语言”源程序中的“注释”字符

④能够识别出“简单语言”源程序中的合法“单词”并输出识别出的一个个“单词”符号序列。

⑤ 识别出的一个个“单词”符号要求为二元组形式: 指出单词类别属性,标识符自身值,常数值.3.提交实验报告

 “简单语言”词法分析程序“源程序”文件

 “简单语言”词法分析程序“源程序”可执行文件

 对“简单语言”词法分析程序的测试实例:“简单语言”源程序及其词法分析结果。

第五篇:编译原理 语法分析器 (java完美运行版)

实验二

语法分析器

一、实验目的

通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力。

二、实验内容

 根据某一文法编制调试 LL(1)分析程序,以便对任意输入的符号串进行分析。

 构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。

 分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。

三、LL(1)分析法实验设计思想及算法

 模块结构:

(1)定义部分:定义常量、变量、数据结构。

(2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);

(3)控制部分:从键盘输入一个表达式符号串;

(4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。

四、实验要求

1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。

2、如果遇到错误的表达式,应输出错误提示信息。

3、对下列文法,用LL(1)分析法对任意输入的符号串进行分析:

(1)E->TG(2)G->+TG|—TG(3)G->ε(4)T->FS(5)S->*FS|/FS(6)S->ε(7)F->(E)(8)F->i 输出的格式如下:

五、实验源程序

LL1.java import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.table.DefaultTableModel;import java.sql.*;import java.util.Vector;public class LL1 extends JFrame implements ActionListener { /**

*

*/

private static final long serialVersionUID = 1L;JTextField tf1;JTextField tf2;JLabel l;JButton b0;JPanel p1,p2,p3;JTextArea t1,t2,t3;JButton b1,b2,b3;JLabel l0,l1,l2,l3,l4;JTable table;Statement sta;Connection conn;ResultSet rs;DefaultTableModel dtm;String Vn[]=null;Vector P=null;

int firstComplete[]=null;//存储已判断过first的数据

char first[][]=null;//存储最后first结果

int followComplete[]=null;//存储已判断过follow的数据

char follow[][]=null;//存储最后follow结果

char select[][]=null;//存储最后select结果

int LL=0;//标记是否为LL(1)String vt_tou[]=null;//储存Vt

Object shuju[][]=null;//存储表达式数据

char yn_null[]=null;//存储能否推出空

LL1(){ setLocation(100,0);setSize(700,780);tf1=new JTextField(13);tf2=new JTextField(13);l=new JLabel(“>>”);l0=new JLabel(“输入字符串:”);l1=new JLabel(“输入的文

法”);l2=new JLabel(“ ”);l3=new JLabel(“

析的结”);l4=new JLabel(“预测

析”);//p1=new JPanel();

p2=new JPanel();p3=new JPanel();t1=new JTextArea(24,20);t2=new JTextArea(1,30);t3=new JTextArea(24,40);b0=new JButton(“确定(S为开始)”);b1=new JButton(“ 判断文法 ”);

:果:表

b2=new JButton(“输入”);b3=new JButton(“清空”);table=new JTable();JScrollPane jp1=new JScrollPane(t1);JScrollPane jp2=new JScrollPane(t2);JScrollPane jp3=new JScrollPane(t3);p2.add(tf1);p2.add(l);p2.add(tf2);

p2.add(b0);p2.add(b1);p2.add(l0);p2.add(l2);p2.add(jp2);p2.add(b2);p2.add(b3);

p2.add(l1);p2.add(l3);p2.add(jp1);p2.add(jp3);

p3.add(l4);p3.add(new JScrollPane(table));add(p2,“Center”);add(p3,“South”);

b0.addActionListener(this);b1.addActionListener(this);b2.addActionListener(this);b3.addActionListener(this);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);table.setPreferredScrollableViewportSize(new Dimension(660,200));setVisible(true);} public void actionPerformed(ActionEvent e){ if(e.getSource()==b0){ String a=tf1.getText();String b=tf2.getText();t1.append(a+'→'+b+'n');}

if(e.getSource()==b1){ t3.setText(“");int Vnnum=0,k;Vn=new String[100];P=new Vector();String s[]=t1.getText().split(”n“);for(int i=0;i

return;}

if(s[i].charAt(0)<='Z'&&s[i].charAt(0)>='A'&&s[i].charAt(1)=='→'){ for(k=0;k=Vnnum){ Vn[Vnnum]=s[i].substring(0, 1);//存入Vn数据 Vnnum++;} P.add(s[i]);} else { t3.setText(”文法输入有误,请重新输入“);return;} } yn_null=new char[100];first=new char[Vnnum][100];int flag=0;String firstVn[]=null;firstComplete=new int[Vnnum];for(int i=0;Vn[i]!=null;i++)//依次求 FIRST** { flag=0;firstVn=new String[20];

if((flag=add_First(first[i],Vn[i],firstVn,flag))==-1)return;firstComplete[i]=1;} t3.append(”first集:“+”n“);//显示FIRST**

for(int i=0;Vn[i]!=null;i++){ t3.append(”first(“+Vn[i]+”)={ “);for(int j=0;first[i][j]!='';j++){ t3.append(first[i][j]+” , “);} t3.append(”}“+”n“);}

follow=new char[Vnnum][100];String followVn[]=null;followComplete=new int[Vnnum];for(int i=0;Vn[i]!=null;i++)//求FOLLOW** { flag=0;followVn=new String[20];

if((flag=tianjiaFollow(follow[i],Vn[i],followVn,flag))==-1)return;followComplete[i]=1;} t3.append(”follow集:“+”n“);//显示FOLLOW**

for(int i=0;Vn[i]!=null;i++){ t3.append(”follow(“+Vn[i]+”)={ “);for(int j=0;follow[i][j]!='';j++){ t3.append(follow[i][j]+” , “);} t3.append(”}“+”n“);} select=new char[P.size()][100];for(int i=0;i

tianjiaSelect(select[i],(String)P.elementAt(i),flag);} t3.append(”select集:“+”n“);//显示SELECT**

for(int i=0;i

for(int i=0;Vn[i]!=null;i++)//判断select交集是否为空 { int biaozhi=0;char save[]=new char[100];for(int j=0;j

if(t.substring(0,1).equals(Vn[i])){ for(k=0;select[j][k]!='';k++){ if(puanduanChar(save,select[j][k])){ save[biaozhi]=select[j][k];biaozhi++;} else//当有交集时,不为LL(1)文法 { t3.append(”不是LL(1)文法!“+”n“);return;} } } } } char Vt[]=new char[100];int biaozhi=0;for(int i=0;i

{ if(t.charAt(j)>'Z'||t.charAt(j)<'A'){ if(puanduanChar(Vt,t.charAt(j))){ Vt[biaozhi]=t.charAt(j);biaozhi++;} } } } if(puanduanChar(Vt,'#'))//若可推出空集,则将#加入Vt。{ Vt[biaozhi]='#';biaozhi++;} vt_tou=new String[biaozhi+1];//根据select和表达式生成预测分析表

shuju=new String[Vnnum][biaozhi+1];String f=”“;vt_tou[0]=f;for(int i=0;itable.setModel(dtm);LL=1;} if(e.getSource()==b3)//清空列表 { tf1.setText(”“);tf2.setText(”“);t1.setText(”“);t2.setText(”“);t3.setText(”“);Vn=null;P=null;firstComplete=null;first=null;followComplete=null;follow=null;select=null;dtm=new DefaultTableModel();table.setModel(dtm);}

if(e.getSource()==b2)//输入字符串并预测分析 { t3.setText(”“);if(LL==1){ String s=t2.getText();for(int i=0;i

return;} } char zifu[]=new char[100];//剩余输入串

char fenxi[]=new char[100];//分析栈 zifu[0]='#';fenxi[1]='S';fenxi[0]='#';int fzifu=1;int ffenxi=2;for(int i=s.length()-1;i>=0;i--){ zifu[fzifu]=s.charAt(i);fzifu++;} int buzhou=2;char n[]=new char[65];//存储要显示的内容

t3.append(”步骤

分析栈 剩余输入串 所用产生式或匹配“+”n“);n[0]='1';n[15]='#';n[14]='S';int u=29;for(int i=fzifu-1;i>=0;i--)

{ n[u]=zifu[i];u++;}

while(!(fenxi[ffenxi-1]=='#'&&zifu[fzifu-1]=='#'))//剩余输入串不为#则分析

{ int i,j;char t=zifu[fzifu-1];char k=fenxi[ffenxi-1];if(t==k)//产生式匹配 { n[49]=k;n[50]='匹';n[51]='配';t3.append(String.copyValueOf(n)+”n“);n=new char[65];fzifu--;ffenxi--;if(buzhou<10)n[0]=(char)('0'+buzhou);//显示步骤数

{ n[0]=(n[1]=(} u=14;{ n[u]=fenxi[y];u++;} u=29;一个字符 { n[u]=zifu[y];u++;} buzhou++;}

{ } { } { else char)('0'+buzhou/10);char)('0'+buzhou%10);for(int y=ffenxi-1;y>=0;y--)//处理分析栈,出栈 for(int y=fzifu-1;y>=0;y--)//处理剩余字符串,消除continue;for(i=0;Vn[i]!=null;i++)//搜寻所用产生式的左部 if(Vn[i].equals(String.valueOf(k)))break;for(j=0;j=vt_tou.length)//全部产生式都不能符合则报错 t3.append(String.copyValueOf(n));t3.append(”n“+”该串不是该文法的句型“+”n“);return;}

Object result1=shuju[i][j];if(result1==null){ t3.append(String.copyValueOf(n));t3.append(”n“+”该串不是该文法的句型“+”n“);return;} else//找到所用产生式 { n[49]=Vn[i].charAt(0);u=50;String result=(String)result1;for(int y=0;y

ffenxi--;for(i=result.length()-1;i>0;i--)//将分析栈内非终结符换为右边表达式

{ if(result.charAt(i)!='#')

{ fenxi[ffenxi]=result.charAt(i);ffenxi++;} } } if(buzhou<10)//显示“步骤” n[0]=(char)('0'+buzhou);else { n[0]=(char)('0'+buzhou/10);n[1]=(char)('0'+buzhou%10);} u=14;for(int y=ffenxi-1;y>=0;y--){ n[u]=fenxi[y];u++;} u=29;for(int y=fzifu-1;y>=0;y--){ n[u]=zifu[y];u++;} buzhou++;} n=new char[65];n[0]='1';n[14]='#';n[29]='#';n[49]='分';n[50]='析';n[51]='成';n[52]='功';t3.append(String.copyValueOf(n));t3.append(”n“+”该串是此文法的句型“+”n“);return;} else { t3.setText(”请先依次输入LL(1)文法,并点击 文法判断 按钮“+”n“);return;} } }

private int add_First(char a[],String b,String firstVn[],int flag)//计算FIRST**(递归){

if(puanduanString(firstVn,b.charAt(0))){addString(firstVn,b);} else { return flag;} for(int i=0;i

String t=(String)P.elementAt(i);for(int k=2;k'Z'||t.charAt(k)<'A')//表达式右端第i个不是非终结符

{ if(flag==0||puanduanChar(a,t.charAt(k))){

if(t.charAt(k)=='#')//#时直接加入first { if(k+1==t.length()){ a[flag]=t.charAt(k);flag++;} int flag1=0;for(int j=0;yn_null[j]!='';j++)//所求非终结符进入yn_null**

{ if(yn_null[j]==b.charAt(0))//判断能否推出空

{ flag1=1;break;} } if(flag1==0){ int j;for(j=0;yn_null[j]!='';j++){ } yn_null[j]=b.charAt(0);} continue;} else//终结符直接加入first** { a[flag]=t.charAt(k);flag++;break;} }break;} else//非终结符 { if(!puanduanString(Vn,t.charAt(k))){ int p=firstComplete(t.charAt(k));//当该非终结符的first已经求出

if(p!=-1){ flag=addElementFirst(a,p,flag);//直接加入所求first

} else

if((flag=add_First(a,String.valueOf(t.charAt(k)),firstVn,flag))==-1)return-1;int flag1=0;for(int j=0;yn_null[j]!='';j++)//当非终结符的first有空

{ if(yn_null[j]==t.charAt(k)){ flag1=1;break;} } if(flag1==1)//当非终结符的first能推出空 {

if(k+1==t.length()&&puanduanChar(a,'#'))//之后无符号,且所求first无# { a[flag]='#';//first中加入# flag++;} continue;//判断下一个字符 } else { break;} } else//错误 { t3.setText(”文法输入有误“+”n“);return-1;} } } } } return flag;}

private int tianjiaFollow(char a[],String

b,String followVn[],int flag)//计算FOLLOW**(递归){

if(puanduanString(followVn,b.charAt(0))){addString(followVn,b);} else { return flag;} if(b.equals(”S“))//当为S时#存入follow { a[flag]='#';flag++;} for(int i=0;i

'Z'||t.charAt(j+1)<'A'))//所求为终结符

{ if(flag==0||puanduanChar(a,t.charAt(2)))//自身 { a[flag]=t.charAt(j+1);flag++;} }

else//所求为非终结符 { int k;for(k=0;Vn[k]!=null;k++){

if(Vn[k].equals(String.valueOf(t.charAt(j+1)))){ break;//找寻下一个非终结符的Vn位置 } } flag=addElementFirst(a,k,flag);//把下一个非终结符first加入所求follow集

for(k=j+1;k

if((t.charAt(j+1)>'Z'||t.charAt(j+1)<'A'))break;else { if(panduan_kong(t.charAt(k))){} else { break;} } } if(k>=t.length())//下一个非终结符可推出空,把表达式左边非终结符的follow集加入所求follow集 { int p=followComplete(t.charAt(0));if(p!=-1){ flag=addElementFollow(a,p,flag);} else

if((flag=tianjiaFollow(a,String.valueOf(t.charAt(0)),followVn,flag))==-1)return-1;} } } else//错误 { t3.setText(”文法输入有误,请重新输入“+”n");return-1;} } if(t.charAt(j)==b.charAt(0)&&j+1==t.length())//下一个字符为空,把表达式左边非终结符的follow集加入所求follow集 { int p=followComplete(t.charAt(0));if(p!=-1){ flag=addElementFollow(a,p,flag);} else

if((flag=tianjiaFollow(a,String.valueOf(t.charAt(0)),followVn,flag))==-1)return-1;

} } } return flag;} private void tianjiaSelect(char a[],String b,int flag)//计算SELECT** { int i=2;int biaozhi=0;while(i

if((b.charAt(i)>'Z'||b.charAt(i)<'A')&&b.charAt(i)!='#')//是终结符 { a[flag]=b.charAt(i);//将这个字符加入到Select**,结束Select**的计算

break;} else if(b.charAt(i)=='#')//是空 { int j;for(j=0;Vn[i]!=null;j++)//将表达式左侧的非终结符的follow加入select { if(Vn[j].equals(b.substring(0,1))){ break;} } for(int k=0;follow[j][k]!='';k++){ if(puanduanChar(a,follow[j][k])){ a[flag]=follow[j][k];flag++;} } break;} else

if(b.charAt(i)>='A'&&b.charAt(i)<='Z'&&i+1

if(puanduanChar(a,first[j][k]))//把表达式右侧所有非终结符的first集加入。{ if(first[j][k]=='#')//first中存在空 { biaozhi=1;} else

{ a[flag]=first[j][k];flag++;} } } if(biaozhi==1)//把右侧所有非终结符的first中的#去除 { i++;biaozhi=0;continue;} else { biaozhi=0;break;} } else

if(b.charAt(i)>='A'&&b.charAt(i)<='Z'&&i+1>=b.length())//是非终结符且没有下一个字符 { int j;for(j=0;Vn[i]!=null;j++){ if(Vn[j].equals(String.valueOf(b.charAt(i)))){ break;} } for(int k=0;first[j][k]!='';k++){

if(puanduanChar(a,first[j][k])){ if(first[j][k]=='#'){ biaozhi=1;//表达式右侧能推出空,标记 } else { a[flag]=first[j][k];//不能推出空,直接将first集加入select集

flag++;}

} } if(biaozhi==1)//表达式右侧能推出空 { for(j=0;Vn[i]!=null;j++){ if(Vn[j].equals(b.substring(0,1)))

{ break;} } for(int k=0;follow[j][k]!='';k++){ if(puanduanChar(a,follow[j][k])){ a[flag]=follow[j][k];//将将表达式左侧的非终结符的follow加入select

flag++;} } break;} else { biaozhi=0;break;} } } }

//返回b在Vt[]的位置

private int puanduanXulie(char Vt[],char b){ int i;for(i=0;Vt[i]!='';i++){ if(Vt[i]==b)break;} return i;}

//判断b是否在a中,在返回false,不在返回true

private boolean puanduanChar(char a[],char b){

for(int i=0;a[i]!='';i++){ if(a[i]==b)return false;} return true;} //判断b是否在a中,在返回false,不在返回true

private boolean puanduanString(String a[],char b){ for(int i=0;a[i]!=null;i++){ if(a[i].equals(String.valueOf(b)))return false;} return true;} //把b加入字符串组firstVn[]

private void addString(String firstVn[],String b){ int i;for(i=0;firstVn[i]!=null;i++){ } firstVn[i]=b;} //判断b是否已完成first判断

private int firstComplete(char b){ int i;for(i=0;Vn[i]!=null;i++){ if(Vn[i].equals(String.valueOf(b))){ if(firstComplete[i]==1)return i;else return-1;} } return-1;} //判断b是否已完成follow判断

private int followComplete(char b){ for(int i=0;Vn[i]!=null;i++){ if(Vn[i].equals(String.valueOf(b))){ if(followComplete[i]==1)return i;else return-1;} } return-1;} //把相应终结符添加到first**中

private int addElementFirst(char a[],int p,int flag){ for(int i=0;first[p][i]!='';i++){ if(puanduanChar(a,first[p][i])&&first[p][i]!='#'){ a[flag]=first[p][i];flag++;} } return flag;} //把相应终结符添加到follow**中

private int addElementFollow(char a[],int p,int flag){ for(int i=0;follow[p][i]!='';i++){ if(puanduanChar(a,follow[p][i])){ a[flag]=follow[p][i];flag++;} } return flag;} //判断a能是否包含空

private boolean panduan_kong(char a){ int i;for(i=0;Vn[i]!=null;i++){ if(Vn[i].equals(String.valueOf(a))){ break;} } for(int j=0;first[i][j]!='';j++){ if(first[i][j]=='#')return true;}

return false;}

public static void main(String[] args){ new LL1();

} }

六、实验结果

七、实验心得体会

通过这次的实验,我深入了解了词法分析器和LL(1)文法预测分析法设计和实现,增强了我的自学能力和独立思考能力,也让我对程序设计有了更大的兴趣,自己通过查找资料、复习课本、编程调试,写实验报告等环节,进一步掌握了以前学到的知识,并且还对编译原理应用有了更深入的认识与掌握。在完成这个程序后,真的很开心,也了使我解到编译原理的魅力所在,激发了我要解决更多更难问题的决心。通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习java语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。

下载用JAVA实现的Pascal语言的词法分析器word格式文档
下载用JAVA实现的Pascal语言的词法分析器.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    用c语言实现单纯形法的编程

    用c语言实现单纯形法的编程 #include "stdio.h" #include "math.h" #include int M,N; float c[100],a[100][100],b[100],CZ[100],Dn[100],th[100],x[100]; int Fn[100]; i......

    计算机网络课程设计-编程实现简单的TCP协议分析器

    编程实现简单的TCP协议分析器 编程实现简单的TCP协议分析器 一、问题描述 编程实现简单的TCP协议分析器,TCP协议分析器是一种用于监督和跟踪网络活动的诊断工具,它从局域网中......

    Java五子棋实现报告

    一、实验目的 (1) 使用Java编写五子棋程序 (2) 掌握编写过程的一些类和类成员的使用,并且了解五子棋制作过程的一些步骤和了解一些算法。 二、实验环境 在电子楼2楼,装有My Eclip......

    学习java用什么软件(大全)

    www.xiexiebang.com 学习java用什么软件 学习java需要什么软件,如今IT是一个抢手热门职业,而JAVA工程师更是各公司急需的人才。在所有软件开发类人才的需求中,对Java工程师的需......

    浅谈java语言现状和发展前景(最终定稿)

    浅谈java语言现状和发展前景 内容摘要:作为一种最流行的网络编程语言之一,java语言在当今信息化社会中发挥了重要的作用。Java语言具有面向对象、跨平台、安全性、多线程等......

    Java编程语言面试题

    西安英泰移动通信学院S2级Java编程语言测试题 1 Java编程语言面试题 一、简答题 1、 简述用Java编程语言编写、编译、解释和执行过程。 2、 简述在Java JDK中,java.exe程序的......

    Java语言课程教学大纲

    Java语言程序设计教学大纲 课程编号: 课内学时:3学时/周学分:3 课程目的与要求 Java语言程序设计是为计算机科学与技术系高年级本科生开设的专业选修课程。目的是让学生了解......

    JAVA语言开发自荐信

    JAVA语言开发自荐信范文如何写?好范文推荐此范文供参考尊敬的领导:您好!首先衷心感谢您在百忙之中浏览我的自荐信,为一位满腔热情的大学生开启一扇希望之门.我是一名即将于20......