首页 > 编程语言 >LR语法分析算法

LR语法分析算法

时间:2023-12-06 23:33:21浏览次数:36  
标签:语法分析 inputQueue state 算法 production LR LogUtil action stateStack

LR语法分析器

组成:一个输入,一个输出,状态栈,驱动程序,语法分析表

注意:规约后需要寻找新的符号在栈顶状态上的转换

例如:

状态栈   符号栈       输入

0 5        $id              *id$           此时需要按F -> id规约

0 3        $F               *id$           3是规约的新符号F在栈顶状态0上的转换

代码实现

/**
     * P159 算法4.44 LR语法分析算法
     */
    public boolean parse(Grammar grammar, List<Symbol> inputs, ParsingTable table) {
        LinkedList<Symbol> inputQueue = new LinkedList<>(inputs);
        inputQueue.addLast(Terminal.dollar);

        // 符号栈 (方便打印)
        Stack<Symbol> symbolStack = new Stack<>();
        int state = 0;// 当前状态
        // 状态栈
        Stack<Integer> stateStack = new Stack<>();
        stateStack.push(state);

        while (true) {
            state = stateStack.peek();
            printStack(state, symbolStack, inputQueue);

            Symbol symbol = inputQueue.getFirst();
            Action action = table.getAction(state, symbol);
            if (action instanceof ShiftAction) {// 移入
                inputQueue.removeFirst();

                ShiftAction shiftAction = (ShiftAction) action;
                stateStack.push(shiftAction.getToId());
                symbolStack.push(symbol);

                LogUtil.print("移入:" + shiftAction.getToId());
                LogUtil.newline();
            } else if (action instanceof ReduceAction) {// 规约
                ReduceAction reduceAction = (ReduceAction) action;
                Production production = reduceAction.getProduction();

                for (Symbol bo : production.getBody()) {
                    if (bo.equals(Terminal.epsilon)) {
                        continue;
                    }
                    stateStack.pop();
                    symbolStack.pop();
                }
                symbolStack.push(production.getHead());

                state = stateStack.peek();
                Integer gotoState = table.gotoSet(state, production.getHead());
                stateStack.push(gotoState);

                LogUtil.print("规约:" + production + " GOTO:" + gotoState);
                LogUtil.newline();

            } else if (action instanceof AcceptAction) {
                LogUtil.print("接受");
                return true;
            } else {
                LogUtil.print("错误");
                return false;
            }
        }
    }

 

标签:语法分析,inputQueue,state,算法,production,LR,LogUtil,action,stateStack
From: https://www.cnblogs.com/kashin/p/17880781.html

相关文章

  • 算法随笔——分块
    介绍分块的基本思想是通过适当的划分和预处理,用空间换时间,更加接近朴素算法,是一种暴力数据结构。例题1例如最经典的区间修改区间查询,若用树状数组来做就显得过于麻烦了。而用线段树做这道题,虽然通用,但马亮比较大,非常不友好。于是一种\(O(nlogn)\)的解法出现了——分块。思路......
  • 简述LVS的工作模式和调度算法
    工作模式:NAT,TUNNEL,DR,FULLNAT算法说明rr轮询调度(Round-Robin),它将请求依次分配不同的RS节点,也就是在RS节点中均摊请求。这种算法简答,但是只适合于RS节点处理性能相差不大的情况wrr加权轮询调度(Weighted Round-Robin)它将依据不同RS节点的权值分配任务。权值较高的RS将优先获得任务,并......
  • 代码随想录算法训练营第七天| 344.反转字符串 541. 反转字符串II
    LeetCode344.反转字符串题目链接: LeetCode344思路: 定义left、right指针,将两指针对应的值反转即可 classSolution{public:voidreverseString(vector<char>&s){intn=s.size();for(intleft=0,right=n-1;left<right;++left,--right){......
  • 【Python】【OpenCV】凸轮廓和Douglas-Peucker算法
    针对遇到的各种复杂形状的主体,大多情况下,我们可以求得一个近似的多边形来简化视觉图像处理,因为多边形是由直线组成的,这样就可以准确的划分区域来便捷后续的操作。 cv2.arcLength()Method:参数:curve:要计算周长的轮廓,可以是一个矩形、圆形、多边形等封闭曲线。closed:一个布尔......
  • C++实现LL1语法分析器
    C++实现LL1语法分析器:预备知识:​ LL1分析法是一种确定的自上而下的分析方法,通过在输入中向前看固定个数(通常为1)的符号来选择正确的产生式从而实现预测分析的效果,预测分析不需要回溯。​由以上定义,LL1分析器是一种表驱动的语法分析器,分析器依赖于语法分析表,需要在输入......
  • 双边滤波算法
      H:\CodeSet\vcg完善1\pclPrj\bilateralFunc.h//双边滤波算法floatsigma_s_=0.5;floatsigma_r_=0.5;pcl::PointCloud<pcl::PointXYZ>::PtrplcCloud1;PointCloud<pcl::Normal>::Ptrcloud_normals;doublekernel(doublex,doublesigma){retur......
  • 【数据结构和算法】搜索算法
    ①搜索最小值python的min函数返回列表中的最小项1defindexOfMin(lyst):2minIndex=03currentIndex=14whilecurrentIndex<len(lyst):5iflyst[currentIndex]<lyst[minIndex]:6minIndex=currentIndex7currentI......
  • 【数据结构和算法】排序算法
    使用swap函数来交换列表中的两项的位置1defswap(lyst,i,j):2'''交换列表中两项的位置'''3temp=lyst[i]4lyst[i]=lyst[j]5lyst[j]=temp①选择排序处于列表第一项,先找到最小项的位置,如果该位置不是列表的第一项,算法会交换这两个位置的项,然后......
  • 路径规划算法 - 求解最短路径 - Dijkstra算法
    Dijkstra算法的思想是广度优先搜索(BFS)贪心策略。是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数如果是负数,则需要Bellman-Ford算法如果想求任意两点之间的距离,就需要用Floyd算法求节点0->4的最短路径每次从未标记的节点中选择距离......
  • 拒绝算法推荐,使用rss订阅消息与新闻!
    算法推荐的弊端就不说了借用RSSHub镜像网站如果你实在不会,又或者觉得麻烦,那你还可以搭其他网友的“便车”。我收集了 9 个公开的 RSShub镜像网站,它们用的都是用自己的服务器,所以在流量方面也不会有问题。服务器1 :https://rsshub.rssforever.com 服务器2 :https://rss......