Java编写的C语言词法分析器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这是java编写的C语言词法分析器,我将核心代码整理起来,准备放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进。这个词法分析器实现的功能有打开文件、保存文件、打开帮助文档、文本域内容的剪切和复制和黏贴、进行词法分析

程序的项目结构如图,Word类和Unidentifiable类是两个JavaBean类,存放的参数有两个row(整型)、word(String),row用于获取行数,word用于获取标识符,LexerFrame是词法分析器的界面类,Analyze封装了进行词法分析的核心代码,doc文件夹放一个帮助文档,当用户点击帮助按钮时可以弹出来以帮助用户使用。

//核心程序:

package com.lexer;

import java.util.ArrayList;

/**

*1~20号为关键字,用下标表示,i+1就是其机器码;21~40号为操作符,用下标表示,i+21就是其机器码;41~60号为分界符,

* 用下标表示,i+41就是其机器码;用户自定义的标识符,其机器码为51;常数的机器码为52;不可以识别的标识符,其机器码为0

*/

public class Analyze {

//关键字

private String

keyword[]={"int","long","char","if","else","for","while","return","break","cont inue",

"switch","case","default","float","double","void","struct","static","do","sh

ort"};

//运算符

private String

operator[]={"+","-","*","/","%","=",">","<","!","==","!=",">=","<=","++","--"," &","&&","||","[","]"};

//分界符

private String delimiter[]={",",";","(",")","{","}","\'","\"",":","#"};

public Analyze() {

}

/**

* 判断是否是数字

*/

public boolean isDigit(char ch){

if(ch>='0'&&ch<='9'){

return true;

}else{

return false;

}

}

/**

* 判断是否是字母的函数

*/

public boolean isLetter(char ch){

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){

return true;

}else{

return false;

}

}

/**

* 判断是否由两个运算符组成

*/

public boolean isTwoOperator(String str,char ch){

char lc;

int flag=0;

if(str.length()>1||str.length()==0){//字符数大于2和无字符的情况

return false;

}else{//字符数等于2的情况

lc=str.charAt(str.length()-1);

if(ch=='='&&(lc=='>'||lc=='<'||lc=='='||lc=='!')){ }else if(ch=='+'&&lc=='+'){

}else if(ch=='-'&&lc=='-'){

}else if(ch=='|'&&lc=='|'){

}else if(ch=='&'&&lc=='&'){

}else{

return false;//否就返回false

}

return true;//其它符号的情况都返回true

}

}

/**

* 获取关键字的机器码

*/

public int getKeywordOpcodes(String str){

int i;

for(i=0;i

if(str.equals(keyword[i]))

break;

}

if(i

return i+1;//返回关键字的机器码

}else{

return 0;

}

}

/**

* 获取操作符的机器码

*/

public int getOperatorOpcodes(String str){

int i;

for(i=0;i

if(str.equals(operator[i]))

break;

if(i

return i+21;//返回操作符的机器码

else

return 0;

}

/**

* 获取分界符的机器码

*/

public int getDelimiterOpcodes(String str){

int i;

for(i=0;i

if(str.equals(delimiter[i]))

break;

}

if(i

return i+41;//返回分界符的机器码

else

return 0;

}

/**

* 判断字符是否可以识别

*/

public boolean isIdent(String str){

char ch;

int i;

for(i=0;i

ch=str.charAt(i);

//非数字串的情况和非由英文字母组成的字符串

if((i==0&&!isLetter(ch))||(!isDigit(ch)&&!isLetter(ch))){ break;

}

}

if(i

return false;

}else{

return true;

}

}

相关文档
最新文档