java语法分析器

java语法分析器
java语法分析器

课程实验二

Java语言子集语法、语义分析器

一.实验目的

1.强化对系统软件综合工程实现能力、规划能力的训练;

2.增强对语法分析器、语义分析及代码生成器基本实现技术的理解;

二.实验内容

用C语言(或C++ )作为宿主语言完成:

Java语言子集语法、语义分析器

三.实验要求与试验验收

1. 完成对附录一中文法描述的Java源代码的语法分析、语义分析及代码生成。代码生成的目标代码为MASM汇编代码;

2. 词法分析使用实验一完成的词法分析器(即与词法分析器有直接接口);

3. 课程考试前通过网络教室提交(包括源码和可执行文件的压缩文件),压缩文件命名:

“学号-姓名-语法语义”

4. 通过测试用例的验收;

附录一Java语言子集文法

→ while(Er)S;

→ Vc < Vc | Vc > Vc

→标识符= Ex; // 标识符使用词法分析识别结果

→标识符| 整常数// 标识符、整场数使用词法分析识别结果

→ Vc P Ex | Vc

→ +| -|*|/ // 运算符必须符合优先级和结合性

英语语法、句式、简单句子结构(透彻分析)

LESSON ONE 句子的三种模式 导言本课的重点是掌握英语的三种基本句型,注意词性和词序,以及定语的位置,同时注意中英文表达上的相同和不相同的地方。三种基本句型虽然简单,但至关重要。掌握好它们,在今后的学习中有一通百通之效。 其实英语只有三种基本句型 ▲主+系动词+表 词序 1 主语 2 系动词 3 表语 即句子的用于连接主语表示主语身份、状态以及主体和表语所处的位置 词性* 名词 代词 Be (is, am, are) * 名词形容词 介词+* 名词(介词短语) 注:*注意该结构中的名词,它们能被定语修饰。 1 这个人是一个老师。The man is a teacher. 主语系表语主语系表语(名词) 2 他(是)很忙。He is busy. 主语系表语主语系表语(形容词)▲注意中文中的系动词经常被省略,而英文中绝不能省。

3 她(是)在教室里。She is in the classroom. 主语系表语主语系表语(介词短语) ▲定语只修饰名词,不破坏句子的基本结构。通常由形容词和介词短语充当,形容词放在所修饰的名词之前,而介词短语放在所修饰的名词之后,请注意英语与汉语词序的不同。看懂中文的定语是翻译好定语的关键。 介词短语 4 幸福是太多和太少之间的一站。--- 英国法学家波洛克 介词短语 Happiness i s a station between too much and too little . -----------Pollock, British jurist 形容词介词短语 5 高个子的男人是从英国来的老师。

形容词介词短语 The tall man is a teacher from England. 介词短语形容词 6. 她在二楼的小教室里。 形容词介词短语 She is i n the small classroom on the second floor. The teacher in the classroom is handsome. My book is o n the deskin the classroom. 表语(介词短语)定语(介词短语)She is in the small classroom on t he second floor.

编译原理词法分析java程序报告

软件学院 编译原理实验报告 实验名称:词法分析器 班级: Java104 姓名:周瑞芳 学号: 201007092413 时间: 2013年4月27日

1.实验题目 此次词法分析器实验的目的是设计并且实现一个词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 实验要求 此次词法分析器实验要求源文件中的源代码,识别出具有独立意义的单词等,其中包括:保留字(关键字)、标识符、常数、运算符、分隔符等五大类。其中运算符要求识别出“++”,“+=”等复杂运算符。并依此将识别出的独立个体词法输出。输出的格式要求是按照二元式的形式,如(1,public)。另外,遇到错误时可显示“Error”,然后跳过错误部分继续显示。 2.算法设计 算法设计思路 1.利用循环数组和字符串下标和截取字符串等基本方法来实现。 2.调用isLetter(char charr)方法来判断读取的字符是否是字母。 3.调用isMath(char charr)方法来判断读取的字符是否是数字。 4.调用isJieFu(char charr)方法来判断读取的字符是否是界符。 5.调用isCompu(char charr)方法来判断读取的字符是否是运算符。 6.调用isKeyword(String str)方法来判断截取的字符串是否是关键字。 3.调试和测试 (1)调试过程总结 经过数次调试,最终成功调试了程序,实现了所需功能。 (2)给出实验结果,如下图:

4.实验总结 经过此次词法分析器的实验,利用所学的变成高级语言实现了一个词法分析器,输入的源代码能够被分析器解析出来。此次实验的要求程序能识别出具有独立意义的单词、字符等,其中包括关键字(保留字)、常数、标识符、运算符、分隔符等五类。其中运算符要求对“++”等复杂运算符能够成功识别。输出的格式要按照二元式的形式,如(public,关键字),而且在遇到错误时要显示“error”,紧接着跳过错误部分继续显示。 在此次编译原理实验,通过老师的细心讲解。我们利用老师讲的词法分析方法,用java语言来编程实现的。 此次词法分析实验,熟练掌握了词法分析的原理,在老师的指导下,顺利的独立完成。在这里对老师的指导和同学的帮助表示感谢。 5.附录(源程序) //import javax.swing.*; import javax.swing.border.TitledBorder; import java.awt.*;

词法分析器的实现与设计

题目:词法分析器的设计与实现 一、引言................................ 错误!未定义书签。 二、词法分析器的设计 (3) 2.1词的内部定义 (3) 2.2词法分析器的任务及功能 (3) 3 2.2.2 功能: (4) 2.3单词符号对应的种别码: (4) 三、词法分析器的实现 (5) 3.1主程序示意图: (5) 3.2函数定义说明 (6) 3.3程序设计实现及功能说明 (6) 错误!未定义书签。 7 7 四、词法分析程序的C语言源代码: (7) 五、结果分析: (12) 摘要:词法分析是中文信息处理中的一项基础性工作。词法分析结果的好坏将直接影响中文信息处理上层应用的效果。通过权威的评测和实际应用表明,IRLAS是一个高精度、高质量的、高可靠性的词法分析系统。众所周知,切分歧义和未登录词识别是中文分词中的两大难点。理解词法分析在编译程序中的作用,加深对有穷自动机模型的理解,掌握词法分析程序的实

现方法和技术,用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。Abstract:lexical analysis is a basic task in Chinese information processing. The results of lexical analysis will directly affect the effectiveness of the application of Chinese information processing. The evaluation and practical application show that IRLAS is a high precision, high quality and high reliability lexical analysis system. It is well known that segmentation ambiguity and unknown word recognition are the two major difficulties in Chinese word segmentation. The understanding of lexical analyse the program at compile, deepen of finite automata model for understanding, master lexical analysis program implementation method and technology, using C language subset of a simple language compilation of a scanned again compiler, to deepen to compile the principle solution, master compiler implementation method and technology. 关键词:词法分析器?扫描器?单词符号?预处理 Keywords: lexical analyzer word symbol pretreatment scanner 一、引言 运用C语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,将结果写入指定文件。本程序是在Visual?Studio环境下,使用C语言作为开发工具。基于实验任务

Java词法分析器

Java语言词法分析器的设计与实现 一.实验目的 1.强化对系统软件综合工程实现能力、规划能力的训练; 2.加强对词法分析原理、方法和基本实现技术的理解; 二.实验内容 1.使用DFA实现词法分析器的设计; 2.实现对Java源程序中注释的过滤; 3.利用两对半缓冲区从文件中逐一读取单词; 4.词法分析结果属性字流存放在独立文件(文件名:scanner_output)中;5.统计源程序每行单词的个数和整个源文件单词个数; 6.具有报告词法错误和出错位置(源程序行号和该行字符)的功能;三.说明 1.先读进半个缓冲区的字符,以后前半区的字符读完了,先把后半区的字符读到前半区,再从文件中读入字符到后半区,从而实现两对半缓冲区读单词;每次前半区读完,把前半区的字符存到第一缓冲区,以免在第一个字符时无法回退;还要建立第二缓冲区,存放当要把第一缓冲区的内容放进缓冲区前半区时后半区的内容。 2.因为附录也有设计空格和注释的属性字,所以空格和注释也输出,但空格不算入单词总数 四.源程序主要函数功能 void readin1() //读取字符到缓冲区前半区 void readin2() //把后半区的内容送到前半区 void readin3() //把第二缓冲区的内容送到后半区 char readchar() //从缓冲区中读取一个字符 void untread() //回退一个字符 void writefile() //把属性字流信息写进文件里 void error(char *string) //扫描到错误的单词,string表示错误的单词已扫描过的字符 void identifier() //扫描标识符 void key() //识别关键字 void number() //扫描数字和点号 void explain(int a) //扫描注释,a表示注释是以// 开始还是以/* 开始 void op1(char a),void op2(char a),void op3(char a),void op4(char a) //分四类扫描运算符

C++实现词法分析器

#include #include using namespace std; char inchar[80], token[8]; char character; int zbbm, p, m = 0, n, row, sum = 0; char *blz[6] = { "while", "if", "else", "switch", "case" }; void input() { for (n = 0; n<8; n++) token[n] = NULL; character = inchar[p++]; while (character == ' ') { character = inchar[p]; p++; } if ((character >= 'a'&&character <= 'z') || (character >= 'A'&&character <= 'Z')) { m = 0; while ((character >= '0'&&character <= '9') || (character >= 'a'&&character <= 'z') || (character >= 'A'&&character <= 'Z')) { token[m++] = character; character = inchar[p++]; } token[m++] = '\0'; p--; zbbm = 6; for (n = 0; n<5; n++) if (strcmp(token, blz[n]) == 0) { zbbm = n + 1; break; } } else if ((character >= '0'&&character <= '9')) { { sum = 0; while ((character >= '0'&&character <= '9')) { sum = sum * 10 + character - '0'; character = inchar[p++]; } } p--; zbbm = 7; if (sum>32767) zbbm = -1; } else switch (character) { case'<':m = 0; token[m++] = character; character = inchar[p++]; if (character == '=') { zbbm = 11; token[m++] = character; }

编译原理 语法分析器 (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;

实验一、词法分析器(含源代码)

词法分析器实验报告 一、实验目的及要求 本次实验通过用C语言设计、编制、调试一个词法分析子程序,识别单词,实现一个C语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。 运行环境: 硬件:windows xp 软件:visual c++6.0 二、实验步骤 1.查询资料,了解词法分析器的工作过程与原理。 2.分析题目,整理出基本设计思路。 3.实践编码,将设计思想转换用c语言编码实现,编译运行。 4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。 三、实验内容 本实验中将c语言单词符号分成了四类:关键字key(特别的将main说明为主函数)、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组*key[]中,将界符分别由程序中的case列出。在词法分析过程中,关键字表和case列出的界符的内容是固定不变的(由程序中的初始化确定),因此,从源文件字符串中识别出现的关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。 对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。 输出形式例如:void $关键字

流程图 、程序 流程图: 开始 输入源文件路径 路径是否有 效 是初始化文件指针 否 将字符加入字符数 组Word[] 是空格,空白或换 行吗 是字母吗是数字吗否否是界符吗否打开源文件 跳过该字符 是是 文件结束? 否 将字符加入字符数 组Word[] 否 将字符加入字符数组Word[] 是 指向下一字符识别指针内容 指向下一字符 是字母惑数字 吗 是 将word 与关键字表key 进行匹 配 否匹配?是输出word 为关键字 输出word 为普通标示符 否将字符加入字符数组Word[] 指向下一字符输出word 为常数 识别指针内容 回退 是数字吗 是 否输出word 为界符 指向下一字符 结束 是输出Word 内容为不可识别 将字符加入字符数组Word[]

语法分析方法

语法分析方法 句子成分分析法 句子成分分析法也叫做中心词分析法。 句子成分分析法的总的特 点是:认定语法分析就是分析一个句子(单句)的句子成分。分析的过程是:(1)先看全句的主要成分,哪个是主语,哪个是谓语;(2)再看充当谓语的动词是不是及物动词,以决定后面是否有连带成分宾语;(3)最后指出附加在主语、宾语之前、谓语之后的所有附加成分句子成分分析法的作用 句子成分分析法在汉语语法研究和语法教学中起过积极的作用。在其他分析方法借鉴、运用到汉语语法研究中来之前,就是靠它建立了汉语语法学,普及了语法知识。句子成分分析法 “ ” 这样,对汉语来说,光是分析层次,远远不足以说明某一语言片段的特征,因此,汉语中运用层次分析法既要讲切分,又要讲定性。 层次分析法的作用 由于层次分析法符合语言的语法构造特点,因此它在语法研究中能起较好的作用。具体表现如下: (1)层次分析法的适用面比较广。它既可以用来分析单句的结构,也可以用来分析复句的结构,还可以用来分析合成词的结构。 (2)可以更好地分化歧义句式。例如上文的“这张照片放大了一点儿”是个歧义句,句子成分分析法不能加以分化,但层次分析法可以很好地加以分化。

(3)可以把语法研究引向深入,更好地揭示语法规律。例如,汉语中动词单独作谓语不自由,到很大的限制,这正是通过层次分析法所获得的一条语法规律。运用层次分析法,不仅要考虑从什么地方切分,而且还要考虑为什么从这个地方切分,这就把语法研究引向了深入。 层次分析法的局限性 层次分析法也有它的局限性。它只能揭示句子内部的构造层次和显形的语法关系,不能揭示句法结构内部的隐性语法关系。例如: 山上架着炮。 门外修着马路。 “山上架着炮”是一个有歧义的句子,它即可以表示(A)“山上有炮”的意思,也可以表示 黑板上写着字。→字写在黑板上。 墙上挂着画。→墙上挂着画。 门上贴着对联。→对联贴在门上。 上述情况表明,[A]式和[C]式之间有变换关系,[A]式可以变换[C]式。 (B)式和(D)式之间的变换 表示(B)义的[B]式“NPL + V + 着+ NP ”可以跟“NPL + 正在+ V + NP”句式(我们把它记为[D]式)相联系。例如: [B] →[D] 院子里演着梆子戏。院子里正在演梆子戏。

C语言词法分析程序java版

附录:核心代码清单 C语言词法分析代码算法实习--------------------------------------------------------By NLLWRQ 功能类: package conversion; import java.io.*; public class Work{ public String filename; public int flage=1; public int error[]={0,0,0,0,0}; public int error1[]={0,0,0,0,0,0}; StringBuffer buffer=new StringBuffer(); private String Keychar[]={"int","char","long","float","double","short","unsigned","struct","union","enum","auto","ext ern", "static","register","typedef","void","if","else","switch","case","default","do","while","for","break", "continue","return","goto","define","include","undef","ifdef","endif","line","sizeof","asm","fortran","ad a","pascal"}; private String Keyfile[]={"stdio","windows","stdlib","ctype","math","time","string"}; public Work(String filename){ this.filename=filename; } boolean isKeyfile(String ch){ for(int i=0;i

编译原理实验二

实验二语法分析 一、实验目的: 设计MiniC的上下文无关文法,利用JavaCC生成调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、语法分析器: 按照MiniC语言的语法规则检查词法分析输出的记号流是否符合这些规则,并根据这些规则所体现出的语言中的各种语法结构的层次性。把规则写入到JavaCC的.jjt文件中,可以生成树状的层次结构。 三、JavaCC: 在JavaCC的文法规范文件中,不仅可以描述语言的语法规范,而且可以描述词法规范,本次实习中,利用JavaCC以MiniC语言构造一个不含语义分析的编译器前端,包括词法分析、语法分析,并要考虑语法分析中的错误恢复问题。通过使用JavaCC, 可以体会LL(k)文法的编写特点,掌握编写JavaCC文法规范文件的方法。 内容:利用JavaCC生成一个MiniC的语法分析器; 要求: 1.用流的形式读入要分析的C语言程序,或者通过命令行输入源程序。 2.具有错误检查的能力,如果有能力可以输出错误所在的行号,并简单提示 3.如果输入的源程序符合MiniC的语法规范,输出该程序的层次结构的语法树本次实习仅完成以下语法范畴的语法分析: 1. 写出一个源程序中仅包含if…else, else语句的语法分析。要求能分析其自身 嵌套. 其他语句可简化处理 2. 写出一个源程序中仅包含for语句的语法分析。要求能分析其自身嵌套, 其他语句可简化处理 3. 写出一个源程序中仅包含while语句的语法分析。要求能分析其自身嵌套。 其他语句可简化处理 4. 写出一个源程序中包含上面的12或者13或者23或者123语句的语法分析。 要求能分析除其自身嵌套外,还包括相互嵌套。其他语句可简化处理 具体实施步骤如下: 1.把MiniC转换为文法如下 <程序〉→ main()〈语句块〉 〈语句块〉→{〈语句串〉}

用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; i20) System.out.println(buf + "\t\t" +21); } if(isDigit(strbuf[i])) { 1

PL0语言词法分析程序

PL/0语言词法分析程序 //这是我编译原理的一次作业,中间有许多不足之处希望大家指正 /*编写PL/0语言的词法分析程序 要求: 1、读入用PL/0语言编写的源程序,正确的进行词法分析,并输出二元式序列。 2、若源程序有词法错误,能够给出出错的准确位置。 3、词法代号如下 (+,+); (-,-); (*,*); (/,/); ((,(); (),)); (,,,); (;,;); (.,.); (#,#); (=,=); (>,>); (<,<); (:=,a); (>=,b); (<=,c); (数字,d); (标识符,e); 关键字代号: (begin,f);

(call,g); (const,h); (do,i); (end,j); (if,k); (odd,l); (procedure,m); (read,n); (then,o); (var,p); (while,q); (write,r); 4、等于运算符号为一个 = 测试程序: A.C ====================== CONST A=10; VAR B,C; PROCEDURE P; VAR D; PROCEDURE Q; VAR X; BEGIN READ(X); D:=X; WHILE X DO CALL P; END; BEGIN WRITE(D);

CALL Q; END; BEGIN CALL P; END. */ /*program name:chifufenxi*/ /*作者:小万 QQ:421404493*/ /*date:2004.10.11*/ #include #include #include #include #include #define N 256//每一行的字符数不能超过256个 char buffer[N]; //用作存放一行字符 char word[20]; //用作存放经过分析单词 char *kword[13]={"begin","call","const","do","end","if","odd","procedure","read","the n","var","while","write"}; char ktype[13]={'f','g','h','i','j','k','l','m','n','o','p','q','r'}; int len;//记录每一行的长度 int count=0;//用来记录行数 void write(char *wstr,char wc,FILE *wout)//将分析结果按照规则写入到文件 { fputc('(',wout); fputs(wstr,wout); fputc(',',wout);

编译原理课程设计报告C语言词法与语法分析器的实现

编译原理课程设计报告 课题名称:编译原理课程设计 C-语言词法与语法分析器的实现

C-词法与语法分析器的实现 1.课程设计目标 (1)题目实用性 C-语言拥有一个完整语言的基本属性,通过编写C-语言的词法分析和语法分析,对于理解编译原理的相关理论和知识有很大的作用。通过编写C-语言词法和语法分析程序,能够对编译原理的相关知识:正则表达式、有限自动机、语法分析等有一个比较清晰的了解和掌握。(2)C-语言的词法说明 ①语言的关键字: else if int return void while 所有的关键字都是保留字,并且必须是小写。 ②专用符号: + - * / < <= > >= == != = ; , ( ) [ ] { } /* */ ③其他标记是ID和NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 注:ID表示标识符,NUM表示数字,letter表示一个字母,digit表示一个数字。 小写和大写字母是有区别的。 ④空格由空白、换行符和制表符组成。空格通常被忽略。 ⑤注释用通常的c语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记)上,且可以超过一行。注释不能嵌套。

(3)程序设计目标 能够对一个程序正确的进行词法及语法分析。 2.分析与设计 (1)设计思想 a.词法分析 词法分析的实现主要利用有穷自动机理论。有穷自动机可用作描述在输入串中识别模式的过程,因此也能用作构造扫描程序。通过有穷自动机理论能够容易的设计出词法分析器。b.语法分析 语法分析采用递归下降分析。递归下降法是语法分析中最易懂的一种方法。它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。 (2)程序流程图 程序主流程图: 词法分析: 语法分析:

java词法分析器

package JAccidenceAnalyse; import .*; import .*; import .*; public class AccidenceAnalyser { private SourceFile; private ReserveFile; private ClassFile; private OutputFile; public Pretreatment pretreatment; public KeyWordTable keyWordTable; public ClassIdentity classIdentity; public Scaner scaner; public ConcreteScanBufferFactory csbFactory; /** * 2)词法分析器主程序 * @roseuid 3D9BB93303D0 */ public AccidenceAnalyser() { "[INFOR]已经建立词法分析器!"); } /** * @roseuid 3D9BAEF9029F */ public void initAA() { getBytes()); ( ("etBytes()); ("etBytes()); (" getBytes()); (" getBytes()); ("词法分析结果如下:\n".getBytes()); ; import .*;

public class ClassIdentity { private Hashtable ClassHash; private File ClassFile; private FileReader classFileReader; rim(); "[INFOR]读取类型种别码: [KEY: " + classCounter + "][VALUE: " + classWord + "]"); classWord); } ; import .*; public class KeyWordTable { private Hashtable KWHash; private File ReserveFile; private FileReader resFileReader; rim(); "[INFOR]读取关键字: [INDEX: " + resCounter + "][VALUE: " + resWord + "]"); resWord); } tem(0). getFirstChild().getNodeValue().trim(); /******************/ cfgString[1] = ("ClassFileName").item(0). getFirstChild().getNodeValue().trim(); /******************/ cfgString[2] = ("SourceFileName").item(0). getFirstChild().getNodeValue().trim(); /******************/ cfgString[3] = ("OutputFileName").item(0). getFirstChild().getNodeValue().trim(); /******************/ } } catch (Exception e) { (); throw new Exception("[ERROR]加载配置文件 " + name + " 错误!");

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);

编译原理实验报告(词法分析器语法分析器)

编译原理实验报告

实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号 2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1 (2)扫描子程序

3

五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include #include #include int i,j,k; char c,s,a[20],token[20]={'0'}; int letter(char s){ if((s>=97)&&(s<=122)) return(1); else return(0); } int digit(char s){ if((s>=48)&&(s<=57)) return(1); else return(0); } void get(){ s=a[i]; i=i+1; } void retract(){ i=i-1; } int lookup(char token[20]){ if(strcmp(token,"while")==0) return(1); else if(strcmp(token,"if")==0) return(2); else if(strcmp(token,"else")==0) return(3); else if(strcmp(token,"switch")==0) return(4); else if(strcmp(token,"case")==0) return(5); else return(0); } void main() { printf("please input string :\n"); i=0; do{i=i+1; scanf("%c",&a[i]);

递归下降语法分析程序设计

编译方法实验报告 令狐采学 实验名称:简单的语法分析程序设计 实验要求 1.功能:对简单的赋值语句进行语法分析 随机输入赋值语句,输出所输入的赋值语句与相应的四元式 2.采用递归下降分析程序完成(自上而下的分析) 3.确定各个子程序的功能并画出流程图 4.文法如下: 5.编码、调试通过 采用标准输入输出方式。输入输出的样例如下: 【样例输入】 x:=a+b*c/d(e+f) 【样例输出】(说明,语句和四元式之间用5个空格隔开)

T1:=b*c (*,b,c,T1) T2:=T1/d (/,T1,d,T2) T3:=a+T2 (+,a,T2,T3) T4:=e+f (+,e,f,T4) T5:=T3T4 (,T3,T4,T5) x:=T5 (:=,T5,,x) 【样例说明】程序除能够正确输出四元式外,当输入的表达式错误时,还应能检测出语法错误,给出相应错误提示。 6.设计35个赋值语句测试实例,检验程序能否输出正确的四 元式;当输入错误的句子时,检验程序能够给出语法错误的相应提示信息。 7.报告内容包括: 递归程序的调用过程,各子程序的流程图和总控流程图,详细设计,35个测试用例的程序运行截图及相关说明,有详细注释的程序代码清单等。

目录 1.语法分析递归下降分析算法5 1.1背景知识5 1.2消除左递归6 2.详细设计及流程图6 2.1 函数void V( ) // V > a|b|c|d|e...|z6 2.2 函数void A( ) // A > V:=E7 2.3 函数void E() //E > TE'7 2.4函数void T( ) // T > FT'8 2.5函数void E1( ) //E'> +TE'|TE'|null8 2.6函数void T1() // T'> *FT'|/FT'|null9 3.测试用例及截图9 3.1测试用例1及截图9 3.2测试用例2及截图10 3.3测试用例3及截图11 代码清单11

相关文档
最新文档