首页 > 编程知识 正文

词法分析器的设计与实现,英汉主要构词法的异同

时间:2023-05-03 12:15:15 阅读:156353 作者:385

不管是词法分析还是语法分析,第一感觉是逻辑严密。 由于项目有自己完整的语言和语法,设计相应的词法分析器和语法分析器就显得尤为重要。

您可以在此下载免费的java词法分析器

java词法分析器的实现原理步骤

首先写下它的正则表达式,然后是NFA,然后是DFA,再对其进行优化,最后准备好了就可以开始写代码。

说明其中的主要函数。

enum Token_Type {

keyword=1,//关键字

标识符,//标识符

操作符r,//运算符

operatorrd,//单运算符

constant,//常数

escape,//转义字符

separator,//边界符号

notype,//无类型

珠石//注释类型

(;

定义为列举那个单词的类型。

typedef struct Token {

Token_Type type; //其类型

char *lexeme; //字符串

intvalue; //属性值

}Token;

//返回单词的结构。

voidinitscanner(char*ch ) {

FP1=fopen(ch,' r ' );

LineNo=1;

//初始化分析器。

语音关闭程序

fclose(FP1;

//关闭分析器

void EmptyTokenString (

消息(token buffer,0,100 );

//清空缓冲区

staticvoidaddchartokenstring (char char )。

{

inttokenlenth=strlen (token buffer );

token lenth1==sizeof (token buffer ) )返回;

TokenBuffer[TokenLenth]=Char;

TokenBuffer[TokenLenth 1]=' ';

//向缓冲区添加字符

静态字符获取器(

char Char;

char=fgetc(FP1 );

返回字符;

//从文件读取字符

saticvoidbackchar(charchar ) {

if(char!=EOF

ungetc(char,fp1 );

}

//把那个文字往后放一层。

statictokenjudgekeytoken (char * id string ); //该函数实现判断关键字

源代码如下所示。

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。

*CopyRight@ice-snowstudio*

* email : bingxue fenggu @ 126.com *

*qq: 405116890*

********************************。

//只考虑整形常数

//没有考虑实型

//需要解决转义字符如何描述的问题

#包含

#包含

#包含

#包含

#define TOKEN_LEN 100

enum Token_Type {

keyword=1,//关键字

标识符,//标识符

操作符r,//运算符

operatorrd,//单运算符

>

constant,              //常量

escape,                //转义符

separator,              //界限符

notype,                  //没有类型

zhushi                   //注释类型

};

typedef struct Token {

Token_Type type; //其类型

char *lexeme ;    //字符串

int  value;       //属性值

}Token;

static Token Token_Tap[] = {

{keyword,"abstract",0x103},

{keyword,"boolean",0x103},

{keyword,"break", 0x103},

{keyword,"byte" ,0x103},

{keyword,"case",0x103},

{keyword,"catch",0x103},

{keyword,"char", 0x103},

{keyword, "class",0x103},

{keyword,"const" ,0x103},

{keyword,"continue" ,0x103},

{keyword,"default" , 0x103},

{keyword,"do",0x103},

{keyword,"double",0x103},

{keyword,"else",0x103},

{keyword,"extends",0x103},

{keyword,"false",0x103},

{keyword,"final",0x103},

{keyword,"finally",0x103},

{keyword,"float",0x103},

{keyword,"for",0x103},

{keyword,"goto",0x103},

{keyword,"if",0x103},

{keyword,"implements",0x103},

{keyword,"import",0x103},

{keyword,"instanceof",0x103},

{keyword,"int",0x103},

{keyword,"interface",0x103},

{keyword,"long",0x103},

{keyword,"native",0x103},

{keyword,"new",0x103},

{keyword,"null",0x103},

{keyword,"package",0x103},

{keyword,"private",0x103},

{keyword,"protected",0x103},

{keyword,"public",0x103},

{keyword,"return",0x103},

{keyword,"short",0x103},

{keyword,"static",0x103},

{keyword,"super",0x103},

{keyword,"switch",0x103},

{keyword,"synchronized",0x103},

{keyword,"this",0x103},

{keyword,"throw",0x103},

{keyword,"throws",0x103},

{keyword,"transient",0x103},

{keyword,"true",0x103},

{keyword,"try", 0x103},

{keyword,"void",0x103},

{keyword,"volatile",0x103},

{keyword,"while",0x103},

{constant,"true",0x105},

{constant,"false",0x105}

//以上是所有的关键字

};

FILE *fp1;// 要读文件的描述符

int LineNo;//单词所在的行数

static char TokenBuffer[TOKEN_LEN];//单词符号的缓存区

void InitScanner(char *ch){

fp1 = fopen(ch,"r+");

LineNo = 1;

}

void CloseScanner(){

fclose(fp1);

}

void EmptyTokenString(){

memset(TokenBuffer,0,100);

}

static void AddCharTokenString(char Char)

{

int TokenLenth=strlen(TokenBuffer);

if(TokenLenth+1==sizeof(TokenBuffer)) return;

TokenBuffer[TokenLenth]=Char;

TokenBuffer[TokenLenth+1]='';

}

static char GetChar(){

char Char;

Char = fgetc(fp1);

return Char;

}

static void BackChar(char Char) {

if(Char!=EOF){

ungetc(Char,fp1);

}

}

static Token JudgeKeyToken(char *IDstring){

int loop;

Token token;

for(loop=0;loop<51;loop++){

if(strcmp(Token_Tap[loop].lexeme,IDstring)==0)

return Token_Tap[loop];

}

token.type = Identifier;

//strcpy(token.lexeme,IDstring);//youwenti.

token.lexeme = IDstring;

token.value = 0x104;

return token;

}

PC官方版

安卓官方手机版

IOS官方手机版

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。