编译原理实验二分析

对于 编译原理实验二

实验二主要分析实验一中的得到的多元式是进行计算器的语义分析

需要从实验1中获取分析成功的多元(种别码,字符串原貌,Value属性,Type属性)式序列

根据多元式中的Type属性获取类型(int、double、运算符等)然后逐步分析所有的多元式,是否符合语义

如果符合则分析下一个,如果不符合,则跳出

如:2+4.2*(5+6)

编写代码控制台将依次输出一下信息

 

获取实验一分析结果

 

待分析的第4个token串为:2+4.2*(5+6)分析如下:
待分析的字符串不包含词法错误
Token{(5,2,2,int)}
Token{(1,+,null,null)}
Token{(8,4.2,4.2,double)}
Token{(3,*,null,null)}
Token{(6,(,null,null)}
Token{(5,5,5,int)}
Token{(1,+,null,null)}
Token{(5,6,6,int)}
Token{(7,),null,null)}
该表达式不存在语法错误。


获取实验二分析结果

 

 

已分析的结果构成的四元式如下:
(1)FAC{+,5,6,t1}
(2)FAC{*,4.2,t1,t2}
(3)FAC{+,2,t2,t3}

已分析的结果的四元式中对应的t?的值如下:
Connect{t1=11, t2=46.2, t3=48.2}
 

对于实验二的分析1、构造表达式定义

2、构造DFA

 

3、根据DFA分析得到

 

 

 

 

 

4、对代码进行编写

主要代码如下所示

 

/**
 * Created by haol on 2016/11/18.
 * 主要方法
 */
public class GuideTranslate {

        public static HashMap<String, String> expression = new HashMap<String, String>();
        public static HashMap<String, String> option = new HashMap<String, String>();

        public static HashMap<String, String> wordEnding = new HashMap<>();


        public static int i;
        boolean end = false;

        public static List<Integer> stateStack = new ArrayList<Integer>();/*状态栈*/
        public static List<String> semanticStack = new ArrayList<String>();//语义栈
        public static List<String> signStack = new ArrayList<String>();//符号栈

        public static List<FourAddressCode> fourAddressCode = new ArrayList<FourAddressCode>();

        QuerySLR querySLR = new QuerySLR();
       // @OperateFAC operateFAC = new OperateFAC();
        SemanticStake anySemanticStack = new SemanticStake();

        public List<Token> initializeSemantic(List<Token> tokens) {

                Calculate calculate = new Calculate();
                calculate.initializeCalculate();
                MathExpression definition = new MathExpression();
                List<HashMap> list = definition.definitionMemanticsRule();

                option = list.get(0);//<key,value> = <R?,表达式右部>
                expression = list.get(1);//<key,value> = <表达式右部,表达式左部>
                wordEnding = definition.wordEnding();/*表达式定义*/

                tokens.add(new Token("#", "#", "#", "#"));/*将token串回追加#结束符*/

                /*初始化开始*/
                i = 0;
                fourAddressCode.clear();

                /*初始化所有栈为空*/
                stateStack.clear();
                signStack.clear();
                semanticStack.clear();


                /*设置所有栈的初始值*/
                stateStack.add(0);
                semanticStack.add("-");
                signStack.add("#");

                return tokens;

        }
		//主要方法是这个,实现手动的填表过程,并将操作语义栈,符号盏,获取剩余要进栈的字符串

        public List<FourAddressCode> analyseSemantic(List<Token> tokens) {
			//根据对应的字符获取goto和action的纵坐标
                GetColumn getCol = new GetColumn();

                tokens = this.initializeSemantic(tokens);

                String actionState;/*SRL表中action状态*/

                int row;/*行下标*/
                int column;/*列下表*/


                while (!end) {
                        /*获取现在状态盏最后一个字符*//*获取现在等待符号盏的字符*/
                        row = stateStack.get(stateStack.size() - 1);
                        column = getCol.reActionCol(tokens.get(i).getStrCodes());
                        actionState = querySLR.actionState(row, column);

                        if (actionState != null) {
                                if (actionState.substring(0, 1).equals("S")) {
                                        this.shiftIn(tokens, row, column, actionState);
                                } else if (actionState.substring(0, 1).equals("R")) {
                                        this.redex(actionState);

                                } else if (actionState.equals("acc")) {
                                        end = true;

                                        System.out.println("该表达式不存在语法错误。");
                                }
                        } else {
                                System.out.println("ERROR:第" + (signStack.size() + 1) + "个字符" + tokens.get(i).getStrApp() + "存在语义错误!");
                                break;
                        }
                }
                return fourAddressCode;
        }

        public void shiftIn(List<Token> tokens, int row, int column, String actionState) {

                stateStack.add(Integer.valueOf(actionState.substring(1)));/*将S?状态的?放入状态盏*/

                if (column == CreateSLRTable.C) {/*如果为C则为常数将值放入语意盏*/
                        semanticStack.add(tokens.get(i).getStrValue());
                } else {/*将-放入*/
                        semanticStack.add("-");
                }
                signStack.add(tokens.get(i).getStrApp());/*在符号盏存入待进盏的字符*/
                i++;
        }

        public void redex(String actionState) {

                GetColumn getRow = new GetColumn();
                OperateList operateList = new OperateList();

                String gotoState;/*SRL表中goto状态*/
                int rightNum;/*归约时右部长度*/
                String rightStr;/*规约时表达式右部*/
                String leftStr;/*归约时表达式左部*/

                rightStr = option.get(actionState);
                leftStr = expression.get(rightStr);
                rightNum = rightStr.length();

                /*将符号栈需要归约的弹出*//*将归约后的入栈*/
                signStack = operateList.deleteState(signStack, rightNum);
                signStack.add(leftStr);

                /*将状态盏对应的弹出*//*获取现在状态盏最后一个字符*/
                /*获取符号盏的刚刚归约的字符,也就是最后面的*/
                stateStack = operateList.deleteState(stateStack, rightNum);
                int row = stateStack.get(stateStack.size() - 1);
                int column = getRow.reGotoCol(signStack.get(signStack.size() - 1));
                gotoState = querySLR.gotoState(row, column);
                stateStack.add(Integer.valueOf(gotoState));

                if (rightNum > 1) {
                        List<String> semantic = operateList.getSemantic(semanticStack, stateStack.size() - 1, rightNum);
                        semanticStack = anySemanticStack.analyseSemanticStack(rightStr, semantic, actionState, semanticStack);
                        //@this.analyseSemanticStack(rightStr, semantic, actionState);
                }
        }
        public boolean isCorrent() {
                return end;
        }


源代码请点击下载

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值