编译原理四大实验——Java

前情提要:

自己慢慢摸索写出的集词法分析、递归下降分析、LL1、波兰式于一体的且带有UI界面的程序。

以下是四个实验目的阐述与结果截图,会贴上最重要的代码。

由于代码有些大,会附有链接收取一点点积分换取完整代码。 

实验程序链接

实验一:词法分析

实验目的

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)

实验截图

实验代码

import javax.swing.JTextArea;

public class LexicalAnalyzer {

    static String[] rwtab=new String[]{"main","if","then","while","do","static",
                                "int","double","struct","break","else",
                                "long","switch","case","typedef","char",
                                "return","const","float","short","continue",
                                "for","void","sizeof"};   //定义的24个关键字,种别码从1开始
    static String storage="";   //存储源程序字符串
    static StringBuilder token=new StringBuilder("");     //存储单词自身组成的字符串

    private char lastchar;		//单个读取字符
    private int index=0;			//单行字符串脚标
    private int syn;				//种别码
    private int row=1;

     //分析器
     void analyzer(){
        token.delete(0, token.length());                //置空token对象,清除
        lastchar=storage.charAt(index);					//索引指向第0位
        if(((lastchar>='a'&&lastchar<='z')||(lastchar>='A'&&lastchar<='Z'))&&index<storage.length()){    //可能是关键字或者自定义的标识符
        	index++; 
        	token.append(lastchar);
            while(((lastchar>='0'&&lastchar<='9')||(lastchar>='a'&&lastchar<='z')||(lastchar>='A'&&lastchar<='Z'))&&index<storage.length()){
            	lastchar=storage.charAt(index++);
            	if((lastchar>='0'&&lastchar<='9')||(lastchar>='a'&&lastchar<='z')||(lastchar>='A'&&lastchar<='Z')) {
            		token.append(lastchar);
            	}else {
            		index--;
            	}
            }
            syn=2;       //默认为识别出的字符串为自定义的标识符,种别码为2
            String s=token.toString();
            for(int i=0; i<rwtab.length; i++){
                if(s.equals(rwtab[i])){     
                    syn=1;
                    break;        //识别出是关键字
                }
            }
        }else if((lastchar>='0'&&lastchar<='9')&&index<storage.length()){		//数字
        	index++;
        	token.append(lastchar);
            while((lastchar>='0'&&lastchar<='9'||lastchar=='.')&&index<storage.length()){ 
                lastchar=storage.charAt(index++);
                if((lastchar>='0'&&lastchar<='9')||lastchar=='.') {
                	 token.append(lastchar);
                }else {
                	index--;
                }
            }
            syn=3;						//整数的种别码为3
        }else if(index<storage.length()){
        	index++;
        	switch(lastchar){
        	case '+':
            case '-':
            case '*':
            	token.append(lastchar);
            	syn=4;
            	break;
            case '<':
                token.append(lastchar);
                syn=4;
                if(index<storage.length()) {
                	lastchar=storage.charAt(index);
                    if(lastchar=='='){
                        token.append(lastchar);
                        index++;
                    }else if(lastchar=='>'){
                        token.append(lastchar);
                        index++;
                    }
                }
                break;
            case '>':
            	token.append(lastchar);
            	syn=4;
                if(index<storage.length()) {
                	lastchar=storage.charAt(index);
                    if(lastchar=='='){
                        token.append(lastchar);
                        syn=4;
                        index++;
  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玲ling_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值