不管是词法分析还是语法分析,第一感觉是逻辑严密。 由于项目有自己完整的语言和语法,设计相应的词法分析器和语法分析器就显得尤为重要。
您可以在此下载免费的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官方手机版