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

来源:互联网 发布:魔兽世界编程宝典下载 编辑:程序博客网 时间:2024/05/26 08:41

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

敲打

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

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

代码输入

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


p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4e9072}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #931a68}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4f76cb}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3933ff}span.s1 {color: #931a68}span.s2 {text-decoration: underline}span.s3 {color: #000000}span.s4 {color: #0326cc}span.s5 {color: #4e9072}span.s6 {color: #7e504f}span.s7 {text-decoration: underline ; color: #7e504f}span.s8 {color: #3933ff}span.s9 {color: #4f76cb}span.s10 {color: #91afcb}span.Apple-tab-span {white-space:pre}

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 blocke.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()+" ");}}}}




原创粉丝点击