编译原理_简单优先文法_语法分析器_Java

本贴完全原创

根据《编译原理》何炎祥第三版第六章语法分析器实现

原理:简单优先分析算法

语言:Java若需要查看算符优先算法,请进入主页查看https://blog.csdn.net/qq_24065713/article/details/71375421

分析结果

MainMethod.java

 

 

public class MainMethod {

    public String jie="";
    public String k = "    ";
    int s = 1;
    public String jieguo = "步骤"+"   "+"符号栈"+"   "+"关系"+"   "+"输入串"+"   "+"操作"+"\n\n";

    public boolean accept(StringBuffer stack1,StringBuffer stack2){
        boolean result ;

        outer:
        while (true) {
            char c1 = stack1.charAt(stack1.length() - 1);//符号栈倒数第一个字符
            char c2 = stack2.charAt(0);//输入串第一个字符
            char c3 = stack1.charAt(stack1.length() - 2);//符号栈倒数第二个字符

            if (c1=='S'&&c2=='$'&&c3=='$') {//判断是简单优先算法的条件
                jie = "OK";
                return true;

            }


            switch (c1) {//根据符号栈最后一位字符判断是什么操作
                case '$':
                    if (DaXiao(c1, c2) == -1) {//比较c1,c2的优先级,根据优先级判断操作方式
                        stack1.append(c2);//移进操作
                        stack2.deleteCharAt(0);//删除原输入串第一位字符
                        jieguo = jieguo+s++;//计数,拼接字符串方式
                        jieguo = jieguo +k+stack1 + k+"</="+k+stack2+k+"移进"+"\n";//结果用字符串拼接方式显示
                    } else {//$优先级最小,所以不可能出现其他情况
                        result = false;
                        jie = jie  + "$无法匹配";
                        break outer;
                    }
                    break;

                case '(':
                    if (DaXiao(c1, c2) == 0 || DaXiao(c1, c2) == -1) {
                        stack1.append(c2);
                        stack2.deleteCharAt(0);
                        jieguo = jieguo+s++;
                        jieguo = jieguo +k+stack1 + k+"</="+k+stack2+k+"移进"+"\n";
                    } else {
                        result = false;
                        jie = jie  + "(无法匹配";
                        break outer;
                    }
                    break;

                case 'a':
                    if (DaXiao(c1, c2) == 1) {
                        stack1.deleteCharAt(stack1.length() - 1);
                        stack1.append('S');
                        jieguo = jieguo+s++;
                        jieguo = jieguo +k+stack1 + k+" > "+k+stack2+k+"S->a"+"\n";
                    }else {
                        result = false;
                        jie = jie  + "a无法匹配";
                        break outer;
                    }
                    break;

                case 'S':
                    if (DaXiao(c1, c2) == 1) {
                        stack1.deleteCharAt(stack1.length() - 1);
                        stack1.append('T');
                        jieguo = jieguo+s++;
                        jieguo = jieguo +k+stack1 + k+" > "+k+stack2+k+"T->S"+"\n";

                    } else if (DaXiao(c1, c2) == 0) {
                        stack1.append(c2);
                        stack2.deleteCharAt(0);
                        jieguo = jieguo+s++;
                        jieguo = jieguo +k+stack1 + k+"</="+k+stack2+k+"移进"+"\n";
                    } else {
                        result = false;
                        jie = jie  + "S无法匹配";
                        break outer;
                    }
                    break;
                case 'T':
                    if (DaXiao(c1, c2) == 1) {
                        if (DaXiao(c3, c1) == -1||DaXiao(c3, c1) == 10)//由于T可能有两种产生情况,所以要另外判断句柄
                        {
                            stack1.deleteCharAt(stack1.length() - 1);
                            stack1.append('R');
                            jieguo = jieguo+s++;
                            jieguo = jieguo +k+stack1 + k+" > "+k+stack2+k+"R->T"+"\n";

                        }
                        else if (DaXiao(c3, c1) ==0||DaXiao(c3, c1) ==1)//由于T可能有两种产生情况,所以要另外判断句柄,
                        {
                            stack1.deleteCharAt(stack1.length()-1);
                            stack1.deleteCharAt(stack1.length()-1);
                            stack1.deleteCharAt(stack1.length()-1);
                            stack1.append('T');
                            jieguo = jieguo+s++;
                            jieguo = jieguo +k+stack1 + k+" > "+k+stack2+k+"T->S,T"+"\n";
                        } else {
                            result = false;
                            jie = jie  + "T无法匹配";
                            break outer;
                        }

                    } else {
                        result = false;
                        jie = jie  + "T无法匹配";
                        break outer;
                    }
                    break;
                case 'R':
                    if (DaXiao(c1, c2) == 0) {
                        stack1.append(c2);
                        stack2.deleteCharAt(0);
                        jieguo = jieguo+s++;
                        jieguo = jieguo +k+stack1 + k+" = "+k+stack2+k+"移进"+"\n";
                    } else {
                        result = false;
                        jie = jie  + "R无法匹配";
                        break outer;
                    }
                    break;
                case ')':
                    if (DaXiao(c1, c2) == 1) {
                        if (DaXiao(c3, c1) != -1)//由于T可能有两种产生情况,所以要另外判断句柄,
                        {
                            stack1.deleteCharAt(stack1.length()-1);
                            stack1.deleteCharAt(stack1.length()-1);
                            stack1.deleteCharAt(stack1.length()-1);
                            stack1.append('S');
                            jieguo = jieguo+s++;
                            jieguo = jieguo +k+stack1 + k+" > "+k+stack2+k+"S->(R)"+"\n";
                        }
                    }
                    else {
                        result = false;
                        jie = jie  + ")无法匹配";
                        break outer;
                    }
                    break;
                case ',':
                    if (DaXiao(c1, c2) == 0 || DaXiao(c1, c2) == -1) {
                        stack1.append(c2);
                        stack2.deleteCharAt(0);
                        jieguo = jieguo+s++;
                        jieguo = jieguo +k+stack1 + k+"</="+k+stack2+k+"移进"+"\n";
                    } else {
                    result = false;
                        jie = jie  + ",无法匹配";
                    break outer;
                }
                    break;
                case '^':
                    if (DaXiao(c1, c2) == 1) {
                        stack1.deleteCharAt(stack1.length() - 1);
                        stack1.append('S');
                        jieguo = jieguo+s++;
                        jieguo = jieguo +k+stack1 + k+" > "+k+stack2+k+"S-a"+"\n";

                    }else {
                        result = false;
                        jie = jie  + "^无法匹配";
                        break outer;
                    }
                    break;
                default:
                    jie = jie +"输入非法字符";
                    return false;
            }
        }
        return result;
    }

    public int DaXiao(char c1,char c2){
        if(c1=='$') return -1;//$

        else if(c1 == 'S'&&c2 ==',')return 0;//S
        else if (c1 == 'S'&& (c2==')'||c2 == '$'))return 1;

        else if(c1=='R'&&c2 ==')')return 0;
        else if(c1=='R'&&c2 =='$')return 1;

        else if (c1=='T'&&(c2 == ')'||c2 == '$')) return 1;//T

        else if (c1 == 'a' &&(c2=='a'||c2 == ')'||c2 == '$'))return 1;//a

        else if (c1 == '^' &&(c2=='a'||c2 == ')'||c2 == '$'))return 1;//^

        else if (c1 == ',' &&(c2=='S'||c2 == 'a'||c2 == '^'||c2 == '('))return -1;//,
        else if (c1 == ',' &&c2=='T')return 0;
        else if (c1 == ',' &&c2=='$')return 1;

        else if (c1 == '(' &&(c2=='S'||c2 == 'T'||c2 == 'a'||c2 == '^'||c2 == '('))return -1;//(
        else if (c1 == '(' &&c2=='R')return 0;
        else if (c1 == '(' &&c2=='$')return 1;

        else if (c1 == ')' &&(c2==','||c2 == ')'||c2 == '$'))return 1;//)

        else return 10;//不存在关系

    }

}

 

 

 

WaiKe.java

 

 

 

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * Created by 吴为 on 2017/4/24.
 */
public class WaiKe {//GUI

    public WaiKe(){
        JFrame jFrame = new JFrame("简单优先分析算法");
        JPanel jPanel = new JPanel();
        JButton jButton = new JButton("开始分析");
        TextArea textArea = new TextArea();
        JTextField jTextField1 = new JTextField("待 输 入 文 法");
        JTextField jTextField2 = new JFormattedTextField("     ");
        TextArea textArea1 = new TextArea();
        textArea1.setText(" | R S T a ^ , ( )\n" +
                "---------------------------------------------------------------------------\n" +
                        "R|               =\n" +
                        "S|           =   >\n" +
                        "T|               >\n" +
                        "a|           >   >\n" +
                        "^|           >   >\n" +
                        ",|   < = < <   <  \n" +
                        "(| = < < < <   <  \n" +
                        ")|           >   >");

        jFrame.setVisible(true);
        jFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        jFrame.setLayout(null);
        jPanel.setLayout(null);
        jFrame.setBounds(100,100,500,800);
        jPanel.setBounds(0,0,500,800);
        textArea.setBounds(0,300,500,500);
        textArea1.setBounds(0,100,500,300);

        jButton.setBounds(175,50,100,30);
        jTextField1.setBounds(50,50,100,30);
        jTextField2.setBounds(300,50,100,30);
        jFrame.add(jPanel);
        jPanel.add(jTextField1);
        jPanel.add(jButton);
        jPanel.add(jTextField2);
        jPanel.add(textArea);
        jPanel.add(textArea1);

        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String wenFa = jTextField1.getText();

                StringBuffer stringBuffer1 = new StringBuffer(" $");
                StringBuffer stringBuffer2 = new StringBuffer(wenFa);

                MainMethod m= new MainMethod();
                m.accept(stringBuffer1,stringBuffer2);

                jTextField2.setText(m.jie);
                textArea.setText(m.jieguo);

            }
        });
    }

}


Test.java

 

 

/**
 * Created by 吴为 on 2017/4/24.
 */
public class Test {//主方法
    public static void main(String []args){
         new WaiKe();

    }
}

 

 

 

 

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
摘 要 编译程序的工作过程通常是词法分析、语法分析、语义分析、代码生成、代码优化。编译程序的这些过程的执行先后就构成了编译程序的逻辑结构,但是这些逻辑结构不一定是按照某一个固定顺序的,也有可能是按照平行或者互锁的方式执行的。 本次课程设计是就简单优先文法原理来做一个简单优先分析器简单优先分析文法的基本思想是对一个文法按一定的原则求出该文法所有符号包括终结符和非终结符之间的优先关系,按照这种关系确定规约过程中的句柄,它的规约过程实际上是规范规约。在算法实现过程中,主要使用visual C++进行编程。 关键字 简单优先关系 大于关系 小于关系 等于关系 Abstract Compiler of the process is usually lexical analysis, grammar analysis, semantic analysis, code generation, code optimization. Compiler of the implementation of these processes have posed a compiler on the logical structure, but these may not necessarily be in accordance with the logical structure of a fixed order, may also be in accordance with the parallel or interlocking approach to the implementation of the. This course is designed on the simple principle of priority to do a simpegrammar priority Analyzer。Simple grammar priority of the basic idea of a grammar obtained by certain principles of the grammar, including all the symbos at the end and at the end of the non-priority, according to this relationship in the process of determining the statute handler, it is actually the process of regulating the Statute of the Statute. In the algorithm process, the main use of visual C programming. Key Words Simple priority relations Over relations Less than relations Equal relations 目 录 摘要…………………………………………………………………………………………2 一、概述……………………………………………………………………………………4 (一)实验环境与开发工具 ………………………………………………………‥4 (二)简单优先文法简介 ……………………………………………………………4 (三)基本概念 ………………………………………………………………………4 (四)优先关系 ………………………………………………………………………4 二、需求分析 ……………………………………………………………………………5 (一)总体功能需求 …………………………………………………………………5 (二)系统的主要功能函数 …………………………………………………………5 (三)系统的设计思想 ………………………………………………………………6 三、详细设计 ……………………………………………………………………………7 (一)等于关系模块 …………………………………………………………………7 (二)小于关系模块 …………………………………………………………………8 (三)大于关系模块 …………………………………………………………………10 (四)句子识别模块 …………………………………………………………………12 四、测试结果………………………………………………………………………………16 五、小结……………………………………………………………………………………19 六、参考文献 ……………………………………………………………………………20 附录 源程序 ………………

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值