当前位置:首页 » 编程软件 » 编译原理词法分析器java代码

编译原理词法分析器java代码

发布时间: 2022-08-18 00:56:48

A. 急求!!!编译原理词法分析器代码

#include <stdio.h>
#include <string.h>
#include <conio.h>
#define norw 13 /* 关键字个数 */
#define nmax 14 /* number的最大位数 */
#define al 10 /* 符号的最大长度 */
#define cn 11
#define IDENT "ident"
#define NUM "number"
#define SYM "sym"
#define ISLETTER(c) ((c)>='A'&&(c)<='Z'||(c)>='a'&&(c)<='z')
#define ISNUMBER(c) ((c)>='0'&&(c)<='9')
void letter();void number();
char ch; /* 获取字符的缓冲区,getch使用 */
char a[al+1]; /* 临时符号,多出的一个字节用于存放0 */
FILE *fin;
char fname[al];
char *word[] = {
"begin", "call" , "const" , "do" , "end" ,
"if" , "odd" , "procere" , "read" , "then" ,
"var" , "while" , "write"
};
int k=0,i=0;
char ssym[][10]={"plus","minus","times","slash","lparen", "rparen","eql","comma","neq","semicolon"};
char csym[]={'+','-','*','/','(',')','=',',','#',';'};

void main() {
do{
printf("Input pl/0 filename:");
gets(fname);
fin=fopen(fname,"r");
}while(!fin);
ch=fgetc(fin);
while(ch!='.'){
for(;' '==ch;ch=fgetc(fin));
if(ISLETTER(ch)){
k=0;
letter();
}else if(ISNUMBER(ch)){
k=0;
number();
}else{
switch(ch){
case ':':
if('='==(ch=fgetc(fin))){
printf("(\":=\",eql)\n");
ch=fgetc(fin);
}break;
case '>':
if('='==(ch=fgetc(fin))){
printf("(\">=\",gtr)\n");
ch=fgetc(fin);
break;
}else
printf("(\">\",geq)\n");break;
case '<':
if('='==(ch=fgetc(fin))){
printf("(\"<=\",leq)\n");
ch=fgetc(fin);break;
}
else
printf("(\"<\",lss)\n");break;
default:
for(i=0;i<norw && ch!=csym[i];i++);
if(i<norw)
printf("(\"%c\",%s)\n",ch,ssym[i]);
ch=fgetc(fin);
}
}
}printf("(\"%c\",period)\n",ch);
}

void letter(){
do{
if(al>k) {
a[k]=ch;
k+=1;
}
ch=fgetc(fin);
}while(ISLETTER(ch));
a[k]='\0';
for(i=0;i<norw && strcmp(a,word[i]);i++);
if(i<norw)
printf("(\"%s\",%s%s)\n",a,a,SYM);
else
printf("(\"%s\",%s)\n",a,IDENT);
}

void number(){
do{
if(nmax>k) {
a[k]=ch;
k+=1;
}
ch=fgetc(fin);
}while(ISNUMBER(ch));
a[k]='\0';
printf("(\"%s\",%s)\n",a,NUM);
}

B. 求词法分析器java语言实现的代码,求解

/*
*词法分析
*
*/
importjava.io.File;
importjava.io.FileReader;

publicclassCompiler{
privatestaticStringstring;
privatestaticStringstr;
privatestaticcharch;
/*
*读取文件
*/
publicstaticvoidgetChar()throwsException{
Filef=newFile("C:\","test.txt");
if(!f.exists()){
System.out.println("文件不存在,请输入正确的文件路径");
}
FileReaderfr=newFileReader(f);
intrs=0;
char[]data=newchar[256];
System.out.print("");

while((rs=fr.read(data))>0){
string=newString(data,0,rs).trim();
}
}
/*
*判断读入的字符是否为字母
*/
publicstaticbooleanisLetter(charc){
if((ch>='a'&&ch<='z')||(ch>+'A'&&ch<='Z')){
returntrue;
}
else
returnfalse;
}
/*
*判断读入的字符是否为数字
*/
publicstaticbooleanisDigit(charc){
if(ch>='0'&&ch<='9'){
returntrue;
}
else
returnfalse;
}
/*
*判断是否为关键字
*/
publicstaticbooleanisKey(Stringstring){
if(string.equals("void")||string.equals("if")||string.equals("for")||string.equals("while")
||string.equals("do")||string.equals("return")||string.equals("break")
||string.equals("main"))
{
returntrue;
}
elsereturnfalse;
}
/*
*判断输入的字符并输出单词符号
*/
publicstaticvoidjudgement()throwsException{
Compiler.getChar();
intm=0;
string+='';
for(inti=0;i<string.length();i++){
switch(m)
{
case0:
ch=string.charAt(i);
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='='
||ch=='>'||ch=='<')
{
m=4;
}
elseif(ch==','||ch==';'||ch=='{'||ch=='}'||ch=='('||ch==')')
{
m=5;
}
elseif(isDigit((ch=string.charAt(i))))
{
str="";
str+=ch;
m=3;
}
elseif(isLetter(ch=string.charAt(i)))
{
str="";
str+=ch;
m=2;
}else{}
break;

case4:
i--;
System.out.println(("(4"+"“"+ch+"”)"));
m=0;
break;

case5:
i--;
System.out.println(("(5"+"“"+ch+"”)"));
m=0;
break;

case2:
if(isLetter(ch=string.charAt(i)))
{
str+=ch;
}
else
{
if(isKey(str))
{
System.out.println("(1"+"“"+str+"”)");
}else{
System.out.println(("(2"+"“"+str+"”)"));
}
i--;
m=0;
}
break;

case3:
if(isDigit((ch=string.charAt(i))))
{
str+=ch;
}
else
{
System.out.println(("(3"+"“"+str+"”)"));
i--;
m=0;
}
break;
}
}
}

publicstaticvoidmain(String[]args)throwsException{
Compiler.judgement();
// System.out.print(b)

}
}

C. 速求编译原理词法分析器,要求说明语言有完整代码能运行。急!!!

不好意思 发成语法的了
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <conio.h>
#define NULL 0
#define true1 1
#define false1 0
FILE *fp;
char ch;
char *keyword[17]={"break","char","continue","do","double",
"else","extern","float","for","if","int","long",
"short","static","switch","void","while"};
char *operatornum[3]={"+","-","*"};
char *comparison[6]={"<","<=","=",">",">=","<>"};
char *interpunction[5]={",",";",":=","(",")"};
char *biaoshifu[6]={"%","$","^","&","_","#"};//
char *zhushifu[3]={"//","/*","*/"};//
char *luoji[3]={"&&","||","!"};//
char search(char searchstr[],int wordtype) {
int i; switch (wordtype) {
case 1:for(i=0;i<=16;i++) {
if(strcmp(keyword[i],searchstr)==0)
return(true1);
} case 2:{
for(i=0;i<=2;i++)
{
if(strcmp(operatornum[i],searchstr)==0)
return(true1);
} break;
} case 3: {
for(i=0;i<=5;i++)
{
if(strcmp(comparison[i],searchstr)==0)
return(true1);
}
break;
}
case 4: for(i=0;i<=4;i++)
{
if(strcmp(interpunction[i],searchstr)==0)
return(true1); }
break; case 5: for(i=0;i<=5;i++)
{
if(strcmp(biaoshifu[i],searchstr)==0)
return(true1);
}break; case 6: for(i=0;i<=2;i++)
{
if(strcmp(zhushifu[i],searchstr)==0)
return(true1);
}break; case 7: for(i=0;i<=2;i++)
{ if(strcmp(luoji[i],searchstr)==0)
return(true1);
}break; }
return(false1);
}
char letterprocess (char ch)
{
int i=-1; char letter[20];
while (isalnum(ch)!=0) {
letter[++i]=ch;
ch=fgetc(fp);
};
letter[i+1]='\0';
if (search(letter,1))
{ if(strcmp(letter,"main"))//
printf("<1,关键字,%s>\n",letter);//
else printf("<2,自定义标识符,%s>\n",letter);//
} else { printf("<2,自定义标识符,%s>\n",letter);//
} return(ch); }
char numberprocess(char ch)//
{ int i=-1; char num[20];
while (isdigit(ch)!=0) {
num[++i]=ch;
ch=fgetc(fp); }
if(isalpha(ch)!=0) {
while(isspace(ch)==0)
{
num[++i]=ch;
ch=fgetc(fp);
} num[i+1]='\0';
printf("3,数字,%s\n",num);
goto u; }
num[i+1]='\0'; printf("<3,数字,%s>\n",num);//
u: return(ch); }
char otherprocess(char ch) {
int i=-1;
char other[20];
if (isspace(ch)!=0)
{
ch=fgetc(fp);
goto u; }
while ((isspace(ch)==0)&&(isalnum(ch)==0)) {
other[++i]=ch;
ch=fgetc(fp); }
other[i+1]='\0';
if (search(other,2))
printf("<4,运算符,%s>\n",other);//
else if (search(other,3))
printf("<4,运算符,%s>\n",other);//
else if (search(other,4)) printf("<5,分隔符号,%s>\n",other);//
else if (search(other,5)) printf("<%s,特殊标识符号>\n",other);
else if (search(other,6)) printf("<%s,注释符号>\n",other);
else if (search(other,7)) printf("<%s,逻辑运算符号>\n",other);
else
printf("错误! 非法字符:%s\n",other);
u: return (ch); }
void main () {
char str,c; printf("**********************************词法分析器***********************************\n");
if((fp=fopen("源程序.txt","r"))==NULL)
printf("源程序无法打开!\n");
else { str =fgetc(fp);

while (str!=EOF) {
if (isalpha(str)!=0)
str=letterprocess(str);
else {
if (isdigit(str)!=0)
str=numberprocess(str);
else
str=otherprocess(str);
}
};
printf("词法分析结束,谢谢使用!\n");
printf("点任意键退出\n");
}
c=getch();
}

这个

D. Java代码到底是如何编译成机器指令的

编译器把一种语言规范转化为另一种语言规范的这个过程需要哪些步骤?回答这个问题需要参照《编译原理》,总结过程如下:

        1)词法分析:读取源代码,一个字节一个字节的读进来,找出这些词法中我们定义的语言关键词如:if、else、while等,识别哪些if是合法的哪些是不合法的。这个步骤就是词法分析过程。

        词法分析的结果:就是从源代码中找出了一些规范化的token流,就像人类语言中,给你一句话你要分辨出哪些是一个词语,哪些是标点符号,哪些是动词,哪些是名词。

        2)语法分析:就是对词法分析中得到的token流进行语法分析,这一步就是检查这些关键词组合在一起是不是符合Java语言规范。如if的后面是不是紧跟着一个布尔型判断表达式。

        语法分析的结果:就是形成一个符合Java语言规定的抽象语法树,抽象语法树是一个结构化的语法表达形式,它的作用是把语言的主要词法用一个结构化的形式组织在一起。这棵语法树可以被后面按照新的规则再重新组织。

        3)语义分析:语法分析完成之后也就不存在语法问题了,语义分析的主要工作就是把一些难懂的,复杂的语法转化成更简单的语法。就如难懂的文言文转化为大家都懂的百话文,或者是注释一下一些不懂的成语。

        语义分析结果:就是将复杂的语法转化为简单的语法,对应到Java就是将foreach转化为for循环,还有一些注释等。最后生成一棵抽象的语法树,这棵语法树也就更接近目标语言的语法规则。

        4)字节码生成:将会根据经过注释的抽象语法树生成字节码,也就是将一个数据结构转化为另外一个数据结构。就像将所有的中文词语翻译成英文单词后按照英文语法组装文英文语句。代码生成器的结果就是生成符合java虚拟机规范的字节码。

E. 求编译原理的词法分析器源码

/* 我上编译原理课时的第一次作业就是这个,flex源码. */
%{
#include<math.h>
int num_lines=0;
%}
DIGIT [0-9]
ID [a-zA-Z_][a-zA-Z0-9]*
%%
"#include" {
printf("<包含头文件,请手动合并文件\\>\n");
fprintf(yyout,"<包含头文件,请手动合并文件\\>\n");
}
{DIGIT}+ {
printf("(3整数, \"%s\")\n", yytext);
fprintf(yyout,"(3整数, \"%s\")\n", yytext);
}
{DIGIT}+"."{DIGIT}* {
printf("(3浮点数, \" %s\")\n",yytext);
fprintf(yyout,"(3浮点数, \" %s\")\n",yytext);
}
auto |
break |
case |
char |
const |
continue |
default |
do |
double |
else |
enum |
extern |
float |
for |
goto |
if |
int |
long |
register |
return |
short |
signed |
sizeof |
static |
struct |
switch |
typedef |
union |
unsigned |
void |
volatile |
while {
fprintf(yyout,"(1, \"%s\")\n",yytext);
fprintf(yyout,"(1, \"%s\")\n",yytext);
}
{ID} {
printf("(2, \"%s\")\n",yytext);
fprintf(yyout,"(2, \"%s\")\n",yytext);
}
"+" |
"++" |
"+=" |
"-" |
"--" |
"-=" |
"->" |
"*" |
"**" |
"*=" |
"/" |
"/=" |
"=" |
"==" |
">" |
">>" |
">=" |
">>=" |
"<" |
"<<" |
"<=" |
"<<=" |
"!" |
"!=" |
"%" |
"%=" |
"&" |
"&&" |
"&=" |
"|" |
"||" |
"|=" |
"^" |
"^=" {
printf("(4, \"%s\")\n",yytext);
fprintf(yyout,"(4, \"%s\")\n",yytext);
}
"{" |
"}" |
"(" |
")" |
";" |
"," |
"'" |
"\"" |
"." |
"?" |
"[" |
"]" |
"\\" |
":" {
printf("(5, \"%s\")\n",yytext);
fprintf(yyout,"(5, \"%s\")\n",yytext);
}
\n {
++num_lines;
}
"/*"[^(*/)\n]*"*/"
(" ")+
[\t]+
. {
printf("(不能识别字符, \"%s\")\n",yytext);
fprintf(yyout,"(不能识别字符, \"%s\")\n",yytext);
}
%%
main(argc,argv)
int argc;
char **argv;
{
++argv,--argc;
if(argc>0)
yyin=fopen(argv[0],"r");
else
yyin=stdin;
yyout=fopen("output.txt","w");
yylex();
fclose(yyout);
}
int yywrap()
{
return 1;
}

/* 附:我们第一次作业的要求。
实验一:用高级语言编写词法分析器(用lex生成)一、实验目的:编制一个识别c语言子集的词法分析器。从输入的源程序中,识别出各个具有独立意义的记号,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个记号的内部编码及记号符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)二、实验过程和指导:(一)准备:1.阅读课本有关章节,明确语言的词法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。2.初步编制好程序。3.准备好多组测试数据。(二)程序要求:程序输入/输出示例:如源程序为C语言。输入如下一段:main(){ int a,b; a = 10; b = a + 20;}要求输出如下:(2,”main”)(5,”(“)(5,”)“)(5,”{“)(1,”int”)(2,”a”)(5,”,”)(2,”b”)(5,”;”)(2,”a”)(4,”=”)(3,”10”)(5,”;”)(2,”b”)(4,”=”)(2,”a”)(4,”+”)(3,”20”)(5,”;”)(5,”)“}
要求(满足以下要求可获得70%该题的得分):识别保留字:if、int、for、while、do、return、break、continue其他的都识别为标识符;常数为无符号整形数;运算符包括:+、-、*、/、=、>、<、>=、<=、!=分隔符包括:,、;、{、}、(、)以上为参考,具体可自行增删。 三、实验检查:1.程序:输入:测试数据(以文件形式);输出:二元组(以文件形式)。2.实验报告:(1)功能描述:该程序具有什么功能?(2)状态转换图。(2)程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图、程序总体执行流程图。(4)源程序代码。(5)实验过程记录:出错次数、出错严重程度、解决办法摘要。(6)实验总结:你在编程过程中花时多少?多少时间在纸上设计?多少时间上机输入和调试?多少时间在思考问题?遇到了哪些难题?你是怎么克服的?你对你的程序的评价?你的收获有哪些?

另可附加:关键字 有符号数 符号表填写 行号记录,等
*/

F. 请用JAVA编程输入一个语句进行词法分析

我最近正在学编译原理,我有c语言实现的词法分析程序,不知可不可以,识别的是TEST语言的单词。

#include<stdio.h>

#include<ctype.h>

#include<string.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(" 打开词法分析输入文件出错! ");

return 1;

}

if((fout=fopen(Scanout, "w")) == NULL) {

printf(" 创建词法分析输出文件出错! ");

return 2;

}


// printf("%c", getc(fin));


ch = getc(fin);


while(ch != EOF) {


while(ch==' ' || ch==' ' || ch==' ') {

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] = '';

// printf("%s", token);

n = binaryFind(0, keywordSum-1, token, keyword);

if(n < 0 ) {

fprintf(fout, "%s %s ", "ID", token);

} else {

fprintf(fout, "%s %s ", 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] = '';


fprintf(fout, "%s %s ", "NUM", token);


} else if(strchr(singleword, ch) > 0) { //singleword


token[0] = ch;

token[1] = '';

ch = getc(fin);


fprintf(fout, "%s %s ", 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] = '';

ch = getc(fin);

} else if((ch=='&')||(ch=='|')||(ch=='=') && ch==token[0]) {

token[1] = ch;

token[2] = '';

ch = getc(fin);

} else {

token[1] = '';

}


fprintf(fout, "%s %s ", 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] = '';

fprintf(fout, "%s %s ", token, token);

}


} else {


token[0] = ch;

token[1] = '';

ch = getc(fin);

es = 3;


fprintf(fout, "%s %s ", "ERROR", token);

}

}


fclose(fin);

fclose(fout);


return es;


}


void main() {


int es = 0;

es = TESTscan();

if(es > 0) {

printf("词法分析有错, 编译停止! ");

} else {

printf("词法分析成功! ");

}


}

G. 编译原理 语义分析 算术表达式求值代码

Java字符串算术表达式求值:importjava.util.ArrayList;importjava.util.Stack;/****@authoryhh**/publicclassCalculate{/***将字符串转化成List*@paramstr*@return*/publicArrayListgetStringList(Stringstr){ArrayListresult=newArrayList();Stringnum="";for(inti=0;igetPostOrder(ArrayListinOrderList){ArrayListresult=newArrayList();Stackstack=newStack();for(inti=0;ipostOrder){Stackstack=newStack();for(inti=0;i

H. 编译原理课程设计词法分析器设计(java实现)

参考答案 永远对生活充满希望,对于困境与磨难,微笑面对。

热点内容
phpurl中文乱码 发布:2024-05-08 06:25:34 浏览:52
社保账户及密码忘了怎么办 发布:2024-05-08 06:25:32 浏览:749
个人热点的密码怎么改 发布:2024-05-08 06:19:13 浏览:638
传递加密 发布:2024-05-08 06:19:02 浏览:681
c语言是啥意思啊 发布:2024-05-08 06:01:09 浏览:695
帝豪换压缩机 发布:2024-05-08 05:42:15 浏览:902
java文件时间 发布:2024-05-08 05:32:04 浏览:267
空气压强算法 发布:2024-05-08 05:29:47 浏览:294
c语言中double的范围 发布:2024-05-08 04:53:29 浏览:122
脏小豆服务器怎么加入 发布:2024-05-08 04:40:40 浏览:552