zoukankan      html  css  js  c++  java
  • 编译原理-递归下降分析法

    题:对下列文法,用递归下降分析法对任意输入的符号串进行分析:

    (1)E->TG

    (2)G->+TG|—TG 

    (3)G->ε,

    (4)T->FS

    (5)S->*FS|/FS

    (6)S->ε

    (7)F->(E)

    (8)F->i

    答:文法太多,可先合并。

    (1)E->FSG

    (2)G->+TG|—TG|ε

    (3)S->*FS|/FS|ε

    (4)F->(E)|i

    结合1,4

    (1)E->ESG|iSG

    (2)G->+TG|—TG|ε

    (3)S->*FS|/FS|ε

    (4)F->(E)|i

    消除左递归

    (1)E->iSGE1

    (2)E1->SGE1|ε

    (3)G->+TG|—TG|ε

    (4)S->*FS|/FS|ε

    (5)F->(E)|i

    好吧,其实上面的化简有些地方并无必要,不过我的代码是按照最后的文法写的。

    package compile;
    
    public class com {
        public static String str="i+i*i";   //待测试语句
        static int seri=0;                  //记录当前读到的序号
        public static void main(String[] args) {
            int t=E();                      //文法
            
            if(t==1) {
                System.out.println(str+" compiled successfully");
            }
            else {
                System.out.println(str+" compiled failed");
            }
        }
        static char getchar() {                       
            if(seri<str.length()) {
                System.out.println(seri+" "+str.charAt(seri));
                return str.charAt(seri++);
            }            
            return ' ';        
            };
        static int E() {
            char ch=getchar();
            if(ch!='i') {
                return  0;
            }return S()*G()*E1();
        }
        static int S() {
            char ch=getchar();
            if(ch=='+'|ch=='-') {
                seri--;return 1;
            }else if(ch=='*'|ch=='/') {
                return F()*S();
            }else if(ch=='i') {
                return 0;
            }
            return 1;        
        }
        static int F() {
            char ch=getchar();
            if(ch=='i') return 1;
            return E();
        }
        static int G() {
            char ch=getchar();
            if(ch=='*'|ch=='/') {
                seri--;return 1;
            }else if(ch=='+'|ch=='-') {
                return F()*S()*G();
            }else if(ch=='i') {
                return 0;
            }
            return 1;            
        }
        static int E1() {
            char ch=getchar();
            if(ch=='i') return 0;
            if(ch==' ') return 1;
            return S()*G()*E1();        
        }    
    }
  • 相关阅读:
    JQuery 获取touchstart,touchmove,touchend 坐标
    js获取可视区大小和页面大小的兼容性写法
    Asp.net MVC4.0自定义Html辅助方法
    无废话版本-Asp.net MVC4.0 Rasor的基本用法
    IE浏览器 下面的文本框,获得焦点后无法输入内容
    C# Log4Net配置
    C#中 ? 和?? 的用法
    工作中的一些问题总结
    JsRender系列-11
    JsRender系列demo-10
  • 原文地址:https://www.cnblogs.com/puffmoff/p/8409962.html
Copyright © 2011-2022 走看看