【编译原理】Java词法编译器

本文详细解读了一段Java代码,涉及if-else、while循环、变量类型判断及流程控制,通过流程图和源码分析了关键字、运算符的使用。结果展示了代码运行后的输出。适合理解Java基础语法和控制结构的学习者。
摘要由CSDN通过智能技术生成

一、题目
int i=1;
if (i>2)
{
i=i+1;
}
else
{
i =i+2;
}
while (i>=1)
{
while (i<5)
{
i=i+1;
}
}
print i;
种别码
流程图
在这里插入图片描述
源码


```java
1.Read.class(读取文件)
package bianyi;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Read {
    public static String buffer = null;
    public void methodRead() throws IOException {
        BufferedReader br = new BufferedReader(
                new FileReader("C:\\Users\\syj" +
                        "\\IdeaProjects\\day04-code\\code\\src\\bianyi\\yuan.txt")
        );
        String str;
        while ((str=br.readLine())!=null)
        {
            if (buffer==null)
            {
                buffer=str;
            }
            else
            {
                buffer+=str;
            }
            buffer+='\n';
        }
        br.close();
    }
}
2.JudgeWord.class(判断是否为保留字)
package bianyi;
public class JudgeWord {
    public static String[] word = {"int","if","else","while","print"};
    public int isWord(String s)
    {
        int flag = -1;
        for (int i = 0; i < word.length; i++) {
            if(word[i].equals(s))
            {
                flag = i +1;
                break;
            }
        }
        return flag;
    }
}
3.JudgeRelate.class(判断是否为关系运算符)
package bianyi;
public class JudgeRelate {
    public static String[] relation = {">=", ">", "<", "="};
    public int isRelate(String s) {
        int flag = 0;
        for (int i = 0; i < relation.length; i++) {
            if (relation[i].equals(s)) {
                flag = i + 8;
                break;
            }
        }
        return flag;
    }
}
4.JudgeOperate.class(判断是否为算术运算符)
package bianyi;
public class JudgeOperate {
    public static String[] op = {"+","-"};
    public int isOperate(String s)
    {
        int flag = 0;
        for (int i = 0; i < op.length; i++) {
            if(op[i].equals(s))
            {
                flag = i +6;
                break;
            }
        }
        return flag;
    }
}
5.JudgeLimit.class(判断是否为边界符)
package bianyi;
public class JudgeLimit {
    public static String[] limit = {"{","}","(",")",";"};
    public int isLimit(String s)
    {
        int flag = 0;
        for (int i = 0; i < limit.length; i++) {
            if(limit[i].equals(s))
            {
                flag = i + 12;
                break;
            }
        }
        return flag;
    }
}
6.Analyse.class(分析)
package bianyi;
public class Analyse {
    public static int typeNum = 0;
    JudgeWord judgeWord = new JudgeWord();
    public int methodAnalyse(int m,String s)
    {
        int num = 0;
        boolean flag = true;
        if ((judgeWord.isWord(s))>=0)
        {
            num = judgeWord.isWord(s);
            typeNum = 1;
        }
        else
        {
            for (int i = 0; i < s.length(); i++) {
                if ((s.substring(i,i+1).compareTo("0")>=0)&&
                      (s.substring(i,i+1).compareTo("9"))<=0)
                {
                    flag = true;
                }
                else
                {
                    flag = false;
                    break;
                }
            }
            if (flag)
            {
                num = 17;
                typeNum = 5;
            }
            else
            {
                num = 18;
                typeNum = 6;
            }
        }
        return num;
    }
}
7.MainClass.class(主函数)
package bianyi;
import Java02.jinjie.Buffer.BufferOutputStream;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
public class MainClass {
    public static String[] type ={"无","关键字","算数符号",
            "关系运算符","分界符","数字","标识符"};
    public static void main(String[] args) throws IOException {
        Read read = new Read();
        JudgeWord judgeWord = new JudgeWord();
        JudgeLimit judgeLimit = new JudgeLimit();
        JudgeOperate judgeOperate = new JudgeOperate();
        JudgeRelate judgeRelate = new JudgeRelate();
        Analyse analyse = new Analyse();
        read.methodRead();
        int k = 0 ,typeNum1 = 0 , num = 0 , sign = 0;
        String Str1=null;
        boolean flag1 = true , flag2 = false;
        do {
            flag2 = false;
//            存储读到的字符串
            Str1 = null;
//            种别码
            num  = 0;
            while ((!(read.buffer.substring(k,k+1).equals("")))&&
              (!(read.buffer.substring(k,k+1).equals("\n"))))
            {
//                分界符
                if (judgeLimit.isLimit(read.buffer.substring(k,k+1))>0)
                {
                    typeNum1 = 4;
                    num = judgeLimit.isLimit(read.buffer.substring(k,k+1));
                    break;
                }
//                operate
                if (judgeOperate.isOperate(read.buffer.substring(k,k+1))>0)
                {
                    typeNum1 = 2;
                    num = judgeOperate.isOperate(read.buffer.substring(k,k+1));
                    break;
                }
//                relation
                if (judgeRelate.isRelate(read.buffer.substring(k,k+1))>0)
                {
                    typeNum1 = 3;
                    if (judgeRelate.isRelate(read.buffer.substring(k,k+2))>0)
                    {
                        flag2 = true;
                        num = judgeRelate.isRelate(read.buffer.substring(k,k+2));
                    }
                    else
                    {
                        num = judgeRelate.isRelate(read.buffer.substring(k,k+1));
                    }
                    break;
                }
                if (Str1 == null)
                {
                    Str1 = read.buffer.substring(k,k+1);
                }
                else
                {
                    Str1 += read.buffer.substring(k,k+1);
                }
                k++;
            }

            if (Str1 != null)
            {
                sign = analyse.methodAnalyse(k,Str1);

                System.out.printf("<"+sign+","+Str1+">");
                System.out.printf("\n");
            }
            if (num>0)
            {
                if(flag2)
                {
                    System.out.printf("<"+num+","+ read.buffer.substring(k,k+2)+">");
                    System.out.printf("\n");
                    k++;
                }
                else
                {
                    System.out.printf("<"+num+","+ read.buffer.substring(k,k+1)+">");
                    System.out.printf("\n");
                }
            }
            k++;
        }while (flag1);
        System.out.printf("<0,end>");
    }
}
结果展示
![在这里插入图片描述](https://img-blog.csdnimg.cn/cc750d753c5f4b28a70d09a891a09a7a.png)
**想要源码可以在下面评论,无偿分享**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值