编译原理词法分析器(java)版的核心代码
public void Scan(JMenuItem result,JTextArea ta){
int state=$START;//初态为0
if(ta.getText().length()==0){
JOptionPane.showMessageDialog(this, "处理的事件为空");
}
else{
String string=ta.getText();
for (int i = 0; i <string.length(); i++) {
boolean flag=true;
char ch=string.charAt(i);
switch (state) {
case $START:
if(isDigit(ch)){
state=$INT;
}
else if(isLetter(ch)){
state=$ID;
}
else if(ch==' '||ch=='\r'||ch=='\n'||ch=='\t'){
flag=false;
}
else if(ch=='!'||ch=='='||ch=='>'||ch=='<'||ch=='+'||ch=='-'||ch=='*'){
state=$DELIM;
}
else if(ch=='/'){
state=$SLAH;
flag=false;
}
else if(ch=='.'){
state=$1_2_3;
}
else{
state=$END;
}
break;
case $INT:
if(!(isDigit(ch))&&ch!='.'){
state=$END;
i--;
flag=false;
}
else if(ch=='.'){
state=$FLOAT;
}
break;
case $FLOAT:
if(!(isDigit(ch))&&ch!='.'){
state=$END;
i--;
flag=false;
}
else if(ch=='.'){
state=$END;
i--;
flag=false;
}
break;
case $ID:
if(!isLetter(ch)&&!isDigit(ch)){
state=$END;
i--;
flag=false;
}
break;
case $DELIM:
if(ch!='='&&ch!='+'&&ch!='-'){
state=$SC;
i=i-2;
flag=false;
}
else {
state=$END;
}
break;
case $SC:
if(ch=='!'||ch=='='||ch=='>'||ch=='<'||ch=='+'||ch=='-'||ch=='/'){
state=$END;
flag=false;
}
break;
case $SLAH:
flag=false;
if(ch!='*'){
state=$SC;
i--;
}
else{
state=$SLAH1;
}
break;
case $SLAH1:
flag=false;
if(ch=='*'){
state=$SLAH2;
}
break;
case $SLAH2:
flag=false;
if(ch=='/'){
state=$END;
}
break;
case $1_2_3:
if(!isDigit(ch)){
flag=false;
state=$END;
i--;
}
break;
default:
break;
}
if(flag){
queue.add(ch);
}
if(state==$END){
if(!queue.isEmpty()){
printToken(queue, table);
state=$START;
}
}
}
}
}
private void printToken(Queue<Character>queue,JTextArea table) {
char[] Token=new char[20];
int i=0;
clear(Token);
while(!(queue.isEmpty())){
Token[i]=queue.poll();
i++;
}
if(isKW(Token)){
String s1=String.valueOf(Token).replaceAll("\0", "");
table.append(new String("("+1+","+"\""+s1+"\""+")"+"\n"));
}
else if(isBZF(Token)){
String s=String.valueOf(Token).replaceAll("\0", "");
table.append(new String("("+2+","+"\""+s+"\""+")"+"\n"));
}
else if(isNum(Token)){
String s=String.valueOf(Token).replaceAll("\0", "");
table.append(new String("("+3+","+"\""+s+"\""+")"+"\n"));
}
else if(isYSF(Token)){
String s=String.valueOf(Token).replaceAll("\0", "");
table.append(new String("("+4+","+"\""+s+"\""+")"+"\n"));
}
else if(isSC(Token)){
String s1=String.valueOf(Token).replaceAll("\0", "");
table.append(new String("("+5+","+"\""+s1+"\""+")"+"\n"));
}
}
private boolean isBZF(char[] token) {//判断是否是标识符
String s1=String.valueOf(token).replaceAll("\0", "");
if(isLetter(s1.charAt(0))||s1.charAt(0)=='_'){
for (int i = 1; i <s1.length(); i++) {
if(isLetter(s1.charAt(i))||isDigit(s1.charAt(i))||s1.charAt(0)=='_'){
return true;
}
}
}
return false;
}
private boolean isYSF(char[] token) {//判断是否是算术运算符
String s1=String.valueOf(token).replaceAll("\0", "");
int len=YSF.length;
for (int i = 0; i <len; i++) {
if(s1.equals(YSF[i]))
return true;
}
return false;
}
private void clear(char[] Token){//清空数组
for(int i=0;i<Token.length;i++){
Token[i]='\0';
}
}
private boolean isNum(char[] token) {//是否是数字
String s1=String.valueOf(token).replaceAll("\0", "");
boolean b=false;
for (int i = 0; i < s1.length(); i++) {
if(isDigit(s1.charAt(i))||s1.charAt(i)=='.')
b=true;
}
return b;
}
private boolean isSC(char[] token) {//是否是分界符
String s1=String.valueOf(token).replaceAll("\0", "");
int len=SC.length;
for (int i = 0; i <len; i++) {
if(s1.equals(SC[i]))
return true;
}
return false;
}
private boolean isKW(char[] token) {//是否是关键字
String s1=String.valueOf(token).replaceAll("\0", "");
int len=KW.length;
for (int i = 0; i <len; i++) {
if(KW[i].equals(s1))
return true;
}
return false;
}
private boolean isLetter(char ch) {//是否是单个字母
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch=='_')
return true;
return false;
}
private boolean isDigit(char ch) {//是否是单个数字
if(ch>='0'&&ch<='9')
return true;
return false;
}
@Override
public void actionPerformed(ActionEvent e) {
JButton j=(JButton)e.getSource();
if(j.equals(button)){
file m=new file();
m.saveFile(button, table);
}
}