Java编写的C语言词法分析器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; } }