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函数方面都有很深的研究,期间也发现一些比较好的资料,记录一下. 这篇论文推 ...
随机推荐
- ASP.NET Core – User Secrets & Azure Key Vault
前言 以前就写过很多篇了 ASP.NET Core – Configuration & Options Asp.net core 学习笔记 ( Azure key-vault ) Asp.ne ...
- Axios——异步框架
Axios--异步框架(简化AJAX代码书写) Axios 请求方式别名
- Flutter Forward 活动正式发布
2023 年 1 月 25 日,Flutter 团队将在肯尼亚首都内罗毕举办 Flutter Forward 大会,并同时开启线上直播,敬请期待! 活动将于北京时间 1 月 25 日 22:30 开始 ...
- 【赵渝强老师】Oracle RAC集群的概念
一.什么是Oracle RAC(Real Application Cluster)? Oracle RAC 是一个具有共享缓存架构的集群数据库,它克服了传统的无共享方法和共享磁盘方法的限制,为您的所有 ...
- 使用GrabCut做分割
主要完成了界面化设计,代码如下 import cv2 as cv import numpy as np import sys from PyQt5.Qt import * class MyWedige ...
- Java日期时间API系列26-----Jdk8中java.time包中的新的日期时间API类,YearMonth类的源码,转换和应用。
Java8中为年月新增了类YearMonth,可以用来表示卡片过期时间等问题. 1.YearMonth 默认格式为:2007-12 1.1 部分源码 * * @implSpec * This clas ...
- 谈一谈你对vue指令的理解
vue指令的本质是给 html 标签新增一些属性 : vue的指令可以分为 3 中类型 : 1. 用于渲染数据的指令,比如 v-for ,v-if ,v-show : 2. 用来交互的指令 ,v-on ...
- MYSQL存储过程-练习4 loop循环
MYSQL存储过程-练习4 loop循环 创建存储过程 1 DELIMITER $$ 2 3 CREATE PROCEDURE `sp_loop`() 4 BEGIN 5 DECLARE i INT; ...
- WTConv:小参数大感受野,基于小波变换的新型卷积 | ECCV'24
近年来,人们尝试增加卷积神经网络(CNN)的卷积核大小,以模拟视觉Transformer(ViTs)自注意力模块的全局感受野.然而,这种方法很快就遇到了上限,并在实现全局感受野之前就达到了饱和.论文证 ...
- 使用FastAPI整合Gradio和Django
大家好,我是每天分享AI应用的萤火君! 经常接触机器学习的同学可能都接触过Gradio这个框架,Gradio是一个基于Python的专门为机器学习项目创建的快速开发框架,可以让开发者快速发布自己的模型 ...