
正文
词法分析器源代码java 词法分析器程序流程图
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
用java做一个简单的词法分析器
网上有个antlr-2.7.5-chinese的文档,你先把基本概念看懂先,否则给你例子也看不懂,去博客园找找几篇博客看看,静下心来看,我这两天也在研究,写出来后再把g文件给你
相关问答
Q1: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
编译原理的实验要求我们用JFlex和JavaCUP来对语言进行分析处理,JavaCUP有一个User's Manual教你怎样做,上面还有一个简单的计算器作为例子,但一试之下,却发现那个例子有不少错误,结果改了我n久才完成~当然马上就决定写一篇博客告诉大家怎样做才是正确的,以免像我那样白走许多弯路。我也不知是不是我找的那份不好,如果你有更好的manual,记得告诉我。
撰写本文的目的:给出使用JFlex、JavaCUP来为一个计算器建立分析器的示例的完整代码,使读者能充分领会JavaCUP的使用方法。虽然本文仅仅给出了计算器的代码,但只要你会写你的语言的翻译模式,则只要照抄这个模版,并改改相应动作就可以了。
引用到的资料:
《CUP User's Manual》,作者:
Scott E. Hudson
地址为李老师那里下载下来的JavaCUP-11a.rar\CUP-develop.tar.gz\develop\manual.html,有详细的英文说明和示例代码,但有很多错。本文中简称为《手册》。
《使用CUP进行语法分析》
详细步骤:1、准备工作。
JavaCUP和JFlex一样,压缩包里边有许多的文件夹和文件,我不知道正统的做法是否要求使用javaCUP也像Jflex一样要设置一堆path啊、classpath啊、jflex_home之类的环境变量,但如果你像我一样只打算用它几次,你只要执行下述的两个简单步骤就可以了,它并不需要你设置任何的环境变量(以下假设你的工作目录是work\):
1)将JavaCUP压缩包里的java-cup-11a.jar解压到work\下。
2)将JavaCUP压缩包里的CUP-develop.tar.gz\develop\src下的java_cup文件夹整个解压到work\下。
现在你可以使用JavaCUP了。
2、为这个计算器写一个词法分析器。或者用JFlex生成一个词法分析器
两种方法都可以生成词法分析器,其中,直接写分析器的代码如下:
Q2: 帮忙写份词法分析程序,C,C++,java,C#都行,越简单越好!
这个我做了一个类似的,识别字符串的,发给你,你在这个基础上改一下吧,哥最近在忙软考不然帮你做做。
程序识别的字符串输入的格式:
1、输入如下正确的常量说明串:
const count=10,sum=81.5,char1=‘f’,max=169,str1=“h*54 2..4S!AAsj”, char2=‘@’,str2=“aa!+h”;
输出:
count(integer,10)
sum(float,81.5)
char1(char, ‘f’)
max(integer,169)
str1(string,“h*54 2..4S!AAsj”)
char2(char, ‘@’)
str2(string,“aa!+h”)
int_num=2; char_num=2; string_num=2; float_num=1.
程序如下:
#includeiostream
using namespace std;
int char_num=0,string_num=0,int_num=0,float_num=0; // 字符值类型,0=字符,1=字符串,2=整数,3=浮点数
class zifu //建立字符类,存储一个字符串的信息
{
public:
int i;
char name[20];
char data[20];
int dataname;
void display(){
i=0;
while(name[i]!='\0')
{
coutname[i];
i++;
}
cout"=";
i=0;
while(data[i]!='\0'){
coutdata[i];
}
coutendl;
coutdatanameendl;
}
};
void input(char a[]) //输入函数
{
char stand[6]="const";
int i=0,judge=0;
gets(a);
for(i=0;i5;i++)
{
if(a[i]==stand[i])
judge++;
}
if(judge!=5 || a[5]!=' ')
{
cout"It is not a constant declaration statement! ";
cout"Please input a string again!"endl;
input(a);
}
}
void sort(zifu aclass[],char b[],int integer,int tag) //识别函数,tag 类标记 ,integer 当前查找的位置
{
int i=0;
while(b[++integer]!='=')
{
if(b[integer]!=' ')
aclass[tag].name[i]=b[integer];
i++; //获取字符串名
}
aclass[tag].name[i]='\0';
i=0;
++integer;
while(b[integer]!=',' b[integer]!=';') //获取字符串值、值类型
{
if(b[integer]='0' b[integer]='9')// 字符值类型,0=字符,1=字符串,2=整数,3=浮点数
aclass[tag].dataname=2;
else if(b[integer]=='.') //浮点数判断。。。真麻烦
{ aclass[tag].dataname=3;
while(b[integer]!=',' b[integer]!=';'){
aclass[tag].data[i]=b[integer];
integer++;i++;}}
else if(b[integer]='a' b[integer]='z')
aclass[tag].dataname=0;
else if(b[integer]='A' b[integer]='Z')
aclass[tag].dataname=1;
else if(b[integer]=='\'' || b[integer]=='\'')
aclass[tag].dataname=0;
else if(b[integer]=='"' || b[integer]=='"')
aclass[tag].dataname=1;
if(b[integer]!=',' b[integer]!=';')
{
aclass[tag].data[i]=b[integer];
i++;
++integer;
}
}
aclass[tag].data[i]='\0';
++tag;
if(b[integer]!=';')
sort(aclass,b,integer,tag);
}
void display(zifu a) //输出函数
{
int n=0;
int q=0;
while (a.name[n]!='\0')
{couta.name[n];
n++;}
cout"(";
switch (a.dataname)
{case 0:
cout"char";
char_num++;
break;
case 1:
cout"string";
string_num++;
break;
case 2:
cout"integer";
int_num++;
break;
case 3:
cout"float";
float_num++;
break;
default:
cout"type error";}
cout',';
while (a.data[q]!='\0')
{couta.data[q];
q++;}
cout")"endl;
}
void main()
{
zifu teger[10];
char c[100];
int tag0=0,integer0=5;
int m=0;
while(1){
cout"please input:"endl;
input(c);
// cout"0=字符,1=字符串,2=整数,3=浮点数"endl;
sort(teger,c,integer0,tag0);
// cout"字符串数量="tag0endl;
for(m=0;mtag0;m++)
{display(teger[m]);}
coutendl"int_num="int_num"; ""char_num="char_num"; ";
cout"string_num="string_num"; ""float_num="float_numendlendl;
}
}
Q3: 我要做个JAVA词法分析工具,求JAVA的所有关键字和操作符
我有Java API里面有所有的接口和类,以及类里的方法
赋值操作符:
= 赋值符号。
+= 加等赋值。
-= 减等赋值。
*= 乘等赋值。
/= 除等赋值。
运算操作符:
+ 加运算符
- 减运算符
* 乘运算符
/ 除运算符
% 求余运算符
++ 自增1运算符
-- 自减1运算符
关系操作符:
小于。
= 小于或者等于。
大于。
= 大于或者等于。
== 等于。
!= 不等于(大于或小于)。
逻辑操作符:
?: if-then-else
逻辑与。位操作符。将左右表达式按二进制按位进行与操作(同位均为1则该位为1,否则为0)。
与操作。
| 逻辑或。
|| 或操作。
^ XOR。
== 等于
!= 不等于
! 逻辑非操作。
】
Abstract 抽象的
一个Java语言中的关键字,用在类的声明中来指明一个类是不能被实例化的,但是可以被其它类继承。一个抽象类可以使用抽象方法,抽象方法不需要实现,但是需要在子类中被实现
break
一个Java的关键字,用来改变程序执行流程,立刻从当前语句的下一句开始执行从。如果后面跟有一个标签,则从标签对应的地方开始执行
case
Java语言的关键字,用来定义一组分支选择,如果某个值和switch中给出的值一样,就会从该分支开始执行。
catch
Java的一个关键字,用来声明当try语句块中发生运行时错误或非运行时异常时运行的一个块。
char
Java语言的一个关键字,用来定义一个字符类型
continue
一个Java的关键字,用来打断当前循环过程,从当前循环的最后重新开始执行,如果后面跟有一个标签,则从标签对应的地方开始执行。
do
一个Java语言的关键字,用来声明一个循环,这个循环的结束条件可以通过while关键字设置
double
一个Java语言的关键字,用来定义一个double类型的变量
else
一个Java语言的关键字,如果if语句的条件不满足就会执行该语句。
final
一个Java语言的关键字。你只能定义一个实体一次,以后不能改变它或继承它。更严格的讲:一个final修饰的类不能被子类化,一个final修饰的方法不能被重写,一个final修饰的变量不能改变其初始值。
finally
一个Java语言的关键字,用来执行一段代码不管在前面定义的try语句中是否有异常或运行时错误发生。
float
一个Java语言的关键字,用来定义一个浮点数变量
for
一个Java语言的关键字,用来声明一个循环。程序员可以指定要循环的语句,推出条件和初始化变量。
if
Java编程语言的一个关键字,用来生成一个条件测试,如果条件为真,就执行if下的语句。
implements
Java(TM)编程语言的一个关键字,在类的声明中是可选的,用来指明当前类实现的接口。
import
Java(TM)编程语言的一个关键字,在源文件的开始部分指明后面将要引用的一个类或整个包,这样就不必在使用的时候加上包的名字。
instanceof
一个二操作数的Java(TM)语言关键字,用来测试第一个参数的运行时类型是否和第二个参数兼容。
int
Java(TM)的一个关键字,用来定义一个整形变量
Java(TM)的一个关键字,用来定义一系列的方法和常量。它可以被类实现,通过implements关键字。
long
Java语言的一个关键字,用来定义一个long类型的变量。
private
Java语言的一个关键字,用在方法或变量的声中。它表示这个方法或变量只能被这个类的其它元素所访问。
protected
Java语言的一个关键字,在方法和变量的声明中使用,它表示这个方法或变量只能被同一个类中的,子类中的或者同一个包中的类中的元素所访问。
public
Java语言的一个关键字,在方法和变量的声明中使用,它表示这个方法或变量能够被其它类中的元素访问。
return
Java语言的一个关键字,用来结束一个方法的执行。它后面可以跟一个方法声明中要求的值。
short
Java语言的关键字,用来定义一个short类型的变量。
static
Java语言的关键字,用来定义一个变量为类变量。类只维护一个类变量的拷贝,不管该类当前有多少个实例。"static" 同样能够用来定义一个方法为类方法。类方法通过类名调用而不是特定的实例,并且只能操作类变量。
this
Java语言的关键字,用来代表它出现的类的一个实例。this可以用来访问类变量和类方法。
throw
Java语言的关键字,允许用户抛出一个exception对象或者任何实现throwable的对象
throws
Java语言的关键字,用在方法的声明中来说明哪些异常这个方法是不处理的,而是提交到程序的更高一层。
transient
Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。
try
Java语言的关键字,用来定义一个可能抛出异常语句块。如果一个异常被抛出,一个可选的catch语句块会处理try语句块中抛出的异常。同时,一个finally语句块会被执行,无论一个异常是否被抛出。
void
Java语言的关键字,用在Java语言的方法声明中说明这个方法没有任何返回值。"void"也可以用来表示一句没有任何功能的语句。
volatile
Java语言的关键字,用在变量的声明中表示这个变量是被同时运行的几个线程异步修改的。
while
Java语言的一个关键字,用来定义一段反复执行的循环语句。循环的退出条件是while语句的一部分。
关于break和continue。
continue语句与break语句相关,但较少用到。continue语句用于使其所在的for、while或do-while语句开始下一次循环。在while与do-while语句中,continue语句的执行意味着立即执行测试部分;在for循环语句中,continue语句的执行则意味着使控制传递到增量部分。
Java没有关键字default,如果class定义前什么也不写就是默认型,说明访问他的范围是包内
Q4: 请用JAVA编程输入一个语句进行词法分析
我最近正在学编译原理,我有c语言实现的词法分析程序,不知可不可以,识别的是TEST语言的单词。
#includestdio.h
#includectype.h
#includestring.h
#define keywordSum 8
char * keyword[keywordSum] = {"do", "else", "for", "if", "int", "read", "while", "write"};
char singleword[50] = "+-*(){};,:";
char doubleword[10] = "=!|";
char Scanin[300], Scanout[300];
FILE * fin, * fout;
int binaryFind(int low, int high, char * c1, char ** c2) {
int mid;
if(low high) return -1;
mid = (low+high)/2;
if(strcmp(c1, c2[mid]) == 0) return mid;
else if(strcmp(c1, c2[mid]) 0) return binaryFind(mid+1, high, c1, c2);
else return binaryFind(low, mid-1, c1, c2);
}
int TESTscan() {
char ch, token[40];
int es = 0, j, n;
printf("请输入源文件名(包括路径):");
scanf("%s", Scanin);
printf("请输入词法分析输出文件名(包括路径):");
scanf("%s", Scanout);
if((fin=fopen(Scanin, "r")) == NULL) {
printf("\n打开词法分析输入文件出错!\n");
return 1;
}
if((fout=fopen(Scanout, "w")) == NULL) {
printf("\n创建词法分析输出文件出错!\n");
return 2;
}
// printf("%c", getc(fin));
ch = getc(fin);
while(ch != EOF) {
while(ch==' ' || ch=='\n' || ch=='\t') {
ch = getc(fin);
}
if(isalpha(ch)) { //标识符
token[0] = ch;
j = 1;
ch = getc(fin);
while(isalnum(ch)) { //判断当前字符是否是字母或数字
token[j++] = ch;
ch = getc(fin);
}
token[j] = '\0';
// printf("%s", token);
n = binaryFind(0, keywordSum-1, token, keyword);
if(n 0 ) {
fprintf(fout, "%s\t%s\n", "ID", token);
} else {
fprintf(fout, "%s\t%s\n", token, token);
}
} else if(isdigit(ch)) { //数字
token[0] = ch;
j = 1;
ch = getc(fin);
while(isdigit(ch)) {
token[j++] = ch;
ch = getc(fin);
}
token[j] = '\0';
fprintf(fout, "%s\t%s\n", "NUM", token);
} else if(strchr(singleword, ch) 0) { //singleword
token[0] = ch;
token[1] = '\0';
ch = getc(fin);
fprintf(fout, "%s\t%s\n", token, token);
} else if(strchr(doubleword, ch) 0) { //doubleword
token[0] = ch;
ch = getc(fin);
if(ch=='=' (token[0]==''||token[0]=='' || token[0] == '!')) {
token[1] = ch;
token[2] = '\0';
ch = getc(fin);
} else if((ch=='')||(ch=='|')||(ch=='=') ch==token[0]) {
token[1] = ch;
token[2] = '\0';
ch = getc(fin);
} else {
token[1] = '\0';
}
fprintf(fout, "%s\t%s\n", token, token);
} else if(ch == '/') { //注释
ch = getc(fin);
if(ch == '*') {
char ch1;
ch1 = getc(fin);
do {
ch = ch1;
ch1 = getc(fin);
} while((ch!='*'||ch1!='/') ch1!=EOF);
ch = getc(fin);
} else {
token[0] = '/';
token[1] = '\0';
fprintf(fout, "%s\t%s\n", token, token);
}
} else {
token[0] = ch;
token[1] = '\0';
ch = getc(fin);
es = 3;
fprintf(fout, "%s\t%s\n", "ERROR", token);
}
}
fclose(fin);
fclose(fout);
return es;
}
void main() {
int es = 0;
es = TESTscan();
if(es 0) {
printf("词法分析有错, 编译停止!\n");
} else {
printf("词法分析成功!\n");
}
}
关于词法分析器源代码java和词法分析器程序流程图的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







