这学期的课程设计,用java写的词法分析器

也看了网上大神们的作品,他们的思路都好清晰啊,我只能领悟了在开始自己写了,大部分都加了注释。。。

敲打

为啥用java呢,c看着vc6.0和cb就头疼啊

修改了一下,先在空格也可以判断了。

代码输入

int a = 21 ;
int b = 22 ;
int c = 0 ;
c = a + b ;
a= a * b ;
int price = 22 ;


package parser;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.lang.reflect.Array;

import java.util.Arrays;

import java.util.Stack;

//输入文本:

//int a=21;

//int b=22;

//int c=0;

//c=a+b;

//a=a*b;

//int price=22;

public class Parser {

Stack<Object> retain = new Stack<>();

Stack<Object> token = new Stack<>();

Stack<Object> cons = new Stack<>();

Stack<Object> oper = new Stack<>();

Stack<Object> bound = new Stack<>();

public int ch;//每次获取的ascll字符

public int code = 0;//分类码

/**  

* 1 基本字   保留字

* 2 标识符   自己的变量名

* 3 常数    

* 4 算符  

* 5 界符  

*/

// 保留字

String[] retainword = {"int","string","float","const","do",

"switch","for","if","else","while",

"break","new","return"};

// 操作符

int operator[] = {42,43,45,47,61};

// 界符

char delimiter[] = {',','{','}',';','(',')'};

// 单词

StringBuffer strapp = new StringBuffer();

public static void main(String[] args) {

String[] delimiters = {"(",")",";",",","",""};

new Parser().scanner();

}

// 输入的是否是字母

public boolean isLetter(){

if ((ch>64&&ch<91)||(ch>96&&ch<123)) {

return true;

}

return false;

}

// 输入的是否是数字

public boolean isFigure(){

if (ch>47&&ch<58){

return true;

}

return false;

}

// 输入的是否是空格

public boolean isSpace(int ch){

if (ch==32||(char)ch==' ') {

return true;

}

return false;

}

// 是否是操作符

public boolean isOperator(int ch){

for (int i : operator) {

if(ch==i){

oper.push((char)ch);

            return true;

}

}

return false;

}

// 是否是界符

public boolean isDelimiters(int ch){

for (char c : delimiter) {

if((char)ch==c){

bound.push((char)ch);

            return true;

}

}

return false;

}

// 单词判断

public int isRetainW(){

for (String string : retainword) {

if (strapp.toString().equals(string)) {

retain.push(strapp.toString());

return 1;

}else if(strapp.length() != 0){  

            if(strapp.charAt(0)>='0' && strapp.charAt(0)<='9'){  

            cons.push(strapp.toString());

                return 3;  

            }  

        }  

}

String a = strapp.toString();

// 如果拼接的字符串为0的话就放弃这个字符串,因为它是代码中的空格

if(a.equals("")){

// System.out.println(a+"!!!");

return 0;

}

token.push(strapp.toString());

return 2;

}

// 字符串拼接

public void strAppend(char ch){

strapp.append(ch);

}

// 输出结果

public void sysostr(){

code = isRetainW();

if (code!=0) {

System.out.println("("+code+","+strapp+")");

}

code = 0;

strapp.delete(0, strapp.length());

}

public void scanner(){

BufferedReader br;

try {

br = new BufferedReader(new FileReader("/Users/rqw1991/Downloads/dd.txt"));

// 读入数据

while((ch=br.read())!=-1){

/**

*/

// 是不是空格,不是空格继续

if (!isSpace(ch)) {

// 是不是字母,是字母就开始进入字符串的拼接

if(isLetter()){

// 如果不是空格而且是字母或者数字的话就开始进行句柄的拼接

if((isLetter()||isFigure())&&(!isSpace(ch))){

strAppend((char)ch);

}

}else if(isFigure()==true&&(!isSpace(ch))){

strAppend((char)ch);

}else if(isFigure()&&(!isSpace(ch))){

strAppend((char)ch);

}

// else if(ch == 61){  

//                        if((strapp.length() != 0 )&& (strapp.charAt(0) == '=')){  

//                            strapp.append((char)ch);  

//                            System.out.println("("+4+",'"+strapp+"')");  

//                            strapp.delete(0, strapp.length());  

//                        }else{  

//                            strapp.append((char)ch);  

//                        }  

//                    }

else if(isDelimiters(ch)&&(!isSpace(ch))){  

                        sysostr();  

                        System.out.println("("+4+","+(char) ch+")");  

                    }

                    else if(isOperator(ch)&&(!isSpace(ch))){  

                        sysostr();  

                        System.out.println("("+5+","+(char) ch+")");  

                    }

}else{

sysostr();

}

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

int rsize = retain.size();

System.out.println("1:"+rsize);

for (int i = 0; i < rsize; i++) {

System.out.print(i+":"+retain.pop()+" ");

}

System.out.println();

int tsize = token.size();

System.out.println("2:"+token.size());

for (int i = 0; i < tsize; i++) {

System.out.print(i+":"+token.pop()+" ");

}

System.out.println();

int csize = cons.size();

System.out.println("3:"+cons.size());

for (int i = 0; i < csize; i++) {

System.out.print(i+":"+cons.pop()+" ");

}

System.out.println();

int osize = oper.size();

System.out.println("4:"+oper.size());

for (int i = 0; i < osize; i++) {

System.out.print(i+":"+oper.pop()+" ");

}

System.out.println();

int bsize = bound.size();

System.out.println("5:"+bound.size());

for (int i = 0; i < bsize; i++) {

System.out.print(i+":"+bound.pop()+" ");

}

}

}

}

package parser;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Stack;

//输入文本:
//int a=21;
//int b=22;
//int c=0;
//c=a+b;
//a=a*b;
//int price=22;

public class Parser {
	Stack<Object> retain = new Stack<>();
	Stack<Object> token = new Stack<>();
	Stack<Object> cons = new Stack<>();
	Stack<Object> oper = new Stack<>();
	Stack<Object> bound = new Stack<>();
	
	
	public int ch;//每次获取的ascll字符
	public int code = 0;//分类码
	/**  
	 * 1 基本字   保留字
	 * 2 标识符   自己的变量名
	 * 3 常数    
	 * 4 算符  
	 * 5 界符  
	 */
	
//	保留字
	String[] retainword = {"int","string","float","const","do",
			"switch","for","if","else","while",
			"break","new","return"};
	
//	操作符
	int operator[] = {42,43,45,47,61};
	
//	界符
	char delimiter[] = {',','{','}',';','(',')'};
	
//	单词
	StringBuffer strapp = new StringBuffer();
	public static void main(String[] args) {
		String[] delimiters = {"(",")",";",",","",""};
		new Parser().scanner();
		
	}
	
//	输入的是否是字母
	public boolean isLetter(){
		if ((ch>64&&ch<91)||(ch>96&&ch<123)) {
			return true;
		}
		return false;
	}
	
//	输入的是否是数字
	public boolean isFigure(){
		if (ch>47&&ch<58){
			return true;
		}
		return false;
	}
	
//	输入的是否是空格
	public boolean isSpace(int ch){
		if (ch==32||(char)ch==' ') {
			return true;
		}
		return false;
	}
	
//	是否是操作符
	public boolean isOperator(int ch){
		for (int i : operator) {
			if(ch==i){
				oper.push((char)ch);
	            return true;
			}
		}
		return false;
	}
	
//	是否是界符
	public boolean isDelimiters(int ch){
		for (char c : delimiter) {
			if((char)ch==c){
				bound.push((char)ch);
	            return true;
			}
		}
		return false;
	}
	
//	单词判断
	public int isRetainW(){
		for (String string : retainword) {
			if (strapp.toString().equals(string)) {
				retain.push(strapp.toString());
				return 1;
			}else if(strapp.length() != 0){  
	            if(strapp.charAt(0)>='0' && strapp.charAt(0)<='9'){  
	            	cons.push(strapp.toString());
	                return 3;  
	            }  
	        }  
		}
		String a = strapp.toString();
//		如果拼接的字符串为0的话就放弃这个字符串,因为它是代码中的空格
		if(a.equals("")){
//			System.out.println(a+"!!!");
			return 0;
		}
		token.push(strapp.toString());
		return 2;
	}
	
//	字符串拼接
	public void strAppend(char ch){
		strapp.append(ch);
	}
	
//	输出结果
	public void sysostr(){
		code = isRetainW();
		if (code!=0) {
			System.out.println("("+code+","+strapp+")");	
		}
		code = 0;
		strapp.delete(0, strapp.length());
	}
	
	public void scanner(){
		BufferedReader br;
		try {
			br = new BufferedReader(new FileReader("/Users/rqw1991/Downloads/dd.txt"));
//			读入数据
			while((ch=br.read())!=-1){
				/**
				 * 
				 */
//				是不是空格,不是空格继续
				if (!isSpace(ch)) {
//					是不是字母,是字母就开始进入字符串的拼接
					if(isLetter()){
//						如果不是空格而且是字母或者数字的话就开始进行句柄的拼接
						if((isLetter()||isFigure())&&(!isSpace(ch))){
							strAppend((char)ch);
						}
					}else if(isFigure()==true&&(!isSpace(ch))){
						strAppend((char)ch);
					}else if(isFigure()&&(!isSpace(ch))){
						strAppend((char)ch);
					}
//					else if(ch == 61){  
//                        if((strapp.length() != 0 )&& (strapp.charAt(0) == '=')){  
//                            strapp.append((char)ch);  
//                            System.out.println("("+4+",'"+strapp+"')");  
//                            strapp.delete(0, strapp.length());  
//                        }else{  
//                            strapp.append((char)ch);  
//                        }  
//                    }
					else if(isDelimiters(ch)&&(!isSpace(ch))){  
                        sysostr();  
                        System.out.println("("+4+","+(char) ch+")");  
                    }
                    else if(isOperator(ch)&&(!isSpace(ch))){  
                        sysostr();  
                        System.out.println("("+5+","+(char) ch+")");  
                    }
				}else{
					sysostr();
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			int rsize = retain.size();
			System.out.println("1:"+rsize);
			for (int i = 0; i < rsize; i++) {
				System.out.print(i+":"+retain.pop()+" ");
			}
			System.out.println();
			int tsize = token.size();
			System.out.println("2:"+token.size());
			for (int i = 0; i < tsize; i++) {
				System.out.print(i+":"+token.pop()+" ");
			}
			System.out.println();
			int csize = cons.size();
			System.out.println("3:"+cons.size());
			for (int i = 0; i < csize; i++) {
				System.out.print(i+":"+cons.pop()+" ");
			}
			System.out.println();
			int osize = oper.size();
			System.out.println("4:"+oper.size());
			for (int i = 0; i < osize; i++) {
				System.out.print(i+":"+oper.pop()+" ");
			}
			System.out.println();
			int bsize = bound.size();
			System.out.println("5:"+bound.size());
			for (int i = 0; i < bsize; i++) {
				System.out.print(i+":"+bound.pop()+" ");
			}
		}
	}
}







  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值