LR语法分析算法
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;
}
}
}
LR语法分析算法的更多相关文章
- 编译原理-第四章 语法分析-4.6 简单LR技术
简单LR分析方法 一.LR语言分析器模型与算法 1.输入.输出.栈和方法 2.LR语法分析表 3.LR分析程序 4.例 例1: 例2: 二.LR语法分析算法 1.LR语法分析算法的定义和概念 定义: ...
- 编译原理_P1004
龙书相关知识点总结 //*************************引论***********************************// 1. 编译器(compiler):从一中语言( ...
- C# 语法分析器(二)LR(0) 语法分析
系列导航 (一)语法分析介绍 (二)LR(0) 语法分析 (三)LALR 语法分析 (四)二义性文法 (五)错误恢复 (六)构造语法分析器 首先,需要介绍下 LALR 语法分析的基础:LR(0) 语法 ...
- LR 算法总结--斯坦福大学机器学习公开课学习笔记
在有监督学习里面有几个逻辑上的重要组成部件[3],初略地分可以分为:模型,参数 和 目标函数.(此部分转自 XGBoost 与 Boosted Tree) 一.模型和参数 模型指给定输入xi如何去 ...
- LL LR SLR LALR 傻傻分不清
[转] 一:LR(0),SLR(1),规范LR(1),LALR(1)的关系 首先LL(1)分析法是自上而下的分析法.LR(0),LR(1),SLR(1),LALR(1)是自下而上的分析法. ...
- SVM(支持向量机)算法
第一步.初步了解SVM 1.0.什么是支持向量机SVM 要明白什么是SVM,便得从分类说起. 分类作为数据挖掘领域中一项非常重要的任务,它的目的是学会一个分类函数或分类模型(或者叫做分类器),而支持向 ...
- LL(1),LR(0),SLR(1),LR(1),LALR(1)的 联系与区别
一:LR(0),SLR(1),规范LR(1),LALR(1)的关系 首先LL(1)分析法是自上而下的分析法.LR(0),LR(1),SLR(1),LALR(1)是自下而上的分析法. ...
- 编译原理 LR分析(主要是LR(0)分析)
一.LR分析的基本原理 1.LR分析的基本思想 LR方法的基本思想就是,在规范归约的过程中,一方面要记住已移进和归约出的整个字符串,也就是说要记住历史:一方面能够根据所用的产生式的推测未来可能碰到的输 ...
- LL(1),LR(0),SLR(1),LALR(1),LR(1)对比与分析
前言:考虑到这几种文法如果把具体内容讲下来肯定篇幅太长,而且繁多的符号对初学者肯定是极不友好的,而且我相信看这篇博客的人已经对这几个文法已经有所了解了,本篇博客的内容只是对 这几个文法做一下对比,加深 ...
- LR的深入理解资料汇集
今天面试被问到LR的算法的梯度和正则化项,自己不太理解,所以找了一些相关资料,发现LR的算法在梯度下降,正则化和sigmoid函数方面都有很深的研究,期间也发现一些比较好的资料,记录一下. 这篇论文推 ...
随机推荐
- vue3 3.3.4
https://cn.vuejs.org/guide/introduction.html#what-is-vue 简介 import { createApp } from 'vue' createAp ...
- 算法学习-Dancing Links X
Dancing Links X 舞蹈链. 实质为用循环十字链在图上将所有"1"的位置链起来 构造较为巧妙,且极易理解,本题为 DLX 模板(精确覆盖问题) DLX 算法的题目做法一 ...
- SpringMVC —— RESTful入门
RESTful入门案例 1.设定http请求动作(动词) @RequestMapping(value = "/users",method = RequestMethod.POS ...
- SpringBoot+Docker +Nginx 部署前后端项目
部署SpringBoot项目(通关版) 一.概述 使用 java -jar 命令直接部署项目的JAR包和使用Docker制作镜像进行部署是两种常见的部署方式.以下是对这两种方式的概述和简要的优劣势分析 ...
- 区分::after和:before中的单冒号和双冒号的作用
单冒号:一般指的是伪类,如鼠标悬停状态设置样式:选择器:hover {设置样式} 双冒号一般指伪元素,给元素的前面/后面添加内容.内容数据按堆栈数据结构存储.
- typeof typeof 'texs'是什么类型
typeof '12' 返回 'string' 是字符串类型 :
- slot原理
vue提供组件插槽能力, 允许开发者在封装组件时,把不确定的部分定义为插槽 : 作用:再不确定的内容位置占位,在子组件内使用 slot 标签写占位的内容 : 插槽的分类 : 默认插槽: 具名插槽:使用 ...
- Exchange学习非常有用的网站
Exchange学习非常有用的网站 https://docs.microsoft.com/zh-cn/exchange/plan-and-deploy/deployment-ref/network-p ...
- MYSQL 批量删除以特定前缀开头的表
前言 这是工作中确实会用到,比如分库分表后有t_order_01.t_order_02.t_order_03...t_order_08 这样的表. 测试过程中造了大量数据进行测试,其中可能含有部分脏数 ...
- Analysis I Chapter 2 - By Professor Terence Tao
目录 2.1 The Peano Axioms 2.2 Addition - Exercises 2.2 - 2.3 Multiplication - Exercises 2.3 - Method o ...