编译原理—语义分析(Java)

本文探讨了使用递归下降语法制导翻译进行Java编译原理中的语义分析,并介绍了测试样例、词法分析和语法分析的过程。
摘要由CSDN通过智能技术生成

递归下降语法制导翻译

实现含多条简单赋值语句的简化语言的语义分析和中间代码生成。

测试样例

begin
a:=2; b:=4;
c:=c-1;
area:=3.14*a*a;
s:=2*3.1416*r*(h+r);
end
#

在这里插入图片描述

词法分析

public class analyzer {
   

    public static List<String> llist=new ArrayList<>();
    static  Map<Integer,Integer> map=new HashMap<>();
    final static String ID = "\\p{Alpha}(\\p{Alpha}|\\d)*";
    static  int countLine=1;
    /** 整形常数 NUM >> 正则表达式*/
    final static String NUM = "\\d\\d*";

    /** token 词法单元
     * <词符号, 种别码> */
    /** 关键字 token*/

    static Map<String, Integer> TOKEN_KEYWORDS;
    /** 运算符/界符 token */
    static Map<String, Integer> TOKEN_OPERATOR_BOUNDARY;
    /** 其他单词 token*/
    static Map<String, Integer> TOKEN_ID_SUM;

    /** 文件根目录*/
    static final String ROOT_DIRECTORY = "program.txt";

    /**
     * 初始化 token 单元
     */
    public static void initToken(){
   //种别码创建
        TOKEN_KEYWORDS = new HashMap<String, Integer>(){
   //关键字
            {
   
                put("begin", 1);
                put("if", 2);
                put("then", 3);
                put("while", 4);
                put("do", 5);
                put("end", 6);
            }
        };

        TOKEN_OPERATOR_BOUNDARY= new HashMap<String, Integer>(){
   //运算符和界符
            {
   
                put("+", 13);
                put("-", 14);
                put("*", 15);
                put("/", 16);
                put(":", 17);
                put(":=", 18);
                put("<", 20);
                put("<>", 21);
                put("<=", 22);
                put(">", 23);
                put(">=", 24);
                put("=", 25);
                put(";", 26);
                put("(", 27);
                put(")", 28);
                put("#", 0);

            }
        };

        TOKEN_ID_SUM= new HashMap<String, Integer>(){
   //标识符和整型常数
            {
   
                put(ID, 10);
                put(NUM, 11);
            }
        };
    }

    /**
     * 读 源程序 文件
     */
    public static void ReadFile1() {
   
        FileInputStream fis = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        try {
   
            fis = new FileInputStream(ROOT_DIRECTORY);
            isr = new InputStreamReader(fis, "UTF-8"); // 转化类
            br = new BufferedReader(isr); // 装饰类
            String line;
            /** 记录 程序 行数 */

            while ((line = br.readLine()) != null) {
     // 每次读取一行,分析一行
                boolean answer = lexicalAnalysis(line);
                if(answer == false){
   
                    System.out.printf("ERROR 编译错误=== 第 %d 行出现 词法错误 \n", countLine);
                    break;
                }
                countLine++;
            }
            System.out.printf("===词法分析完成===\n");
        } catch (Exception ex) {
   
            ex.printStackTrace();
        } finally {
   
            try {
   
                br.close(); // 关闭最后一个类,会将所有的底层流都关闭
            } catch (Exception ex) {
   
                ex.printStackTrace();
            }
        }
    }

    /** 判断key是否是其他单词*/
    private static boolean isIDOrSUM(String key){
   
        if (key.matches(<
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值