Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法...
Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
于是我们可以把上面的语法改写成如下形式:1
合并前缀1
语法分析有自上而下和自下而上两种分析方法2
递归下降是现阶段主流的语法分析方法,2
于是我们可以把上面的语法改写成如下形式:
1) Operator=”+” | “-” | “*” | “/”
2) Expression=<数字> | “(“ Expression “)” | “(“ Operator Expression Expression “)”
第一条语法规则说的是Operator,也就是操作符,可以是加号、减号、乘号或者除号。第二条语法规则说的是一条表达式可以只由数字构成、一个加了括号的表达式或者一个加上了括号的操作符和两个参数。
合并前缀
“(“ Expression “)” | “(“ Operator Expression Expression “)”。我们注意到,这两个部分都是使用括号开始和结束的,因此在写代码的时候可以把它们写在一起,只把中间的部分分开。这种方法在课本中通常被称为合并前缀。于是我们可以写一个GetExpression函数。这个函数首先判断字符串是不是由数字开头,否则的话看一看是否由括号开头。如果是括号开头的话,那么检查接下来的是Operator还是一个Expression。如果是Expression则到此结束,如果是Operator的话还要再输入两个Expression。然后判断一下是不是由右括号结束字符串:
篇文章相比起以前的两篇正则表达式来的确是短了不少。递归下降法是一种适合人脑使用而不是电脑使用的方法。这种方法非常好用,所以大部分编译原理的教科书都会专门使用一个章节来说明递归下降的实现、局限性以及遇到的问题的解决方法。这篇文章不是理论文章,所以有一些本文没阐述到的问题可以通过人的智商来解决。
。今天介绍的这种方法叫做递归下降(recursive descent)法,这是一种适合手写语法编译器的方法,且非常简单。递归下降法对语言所用的文法有一些限制,但递归下降是现阶段主流的语法分析方法,因为它可以由开发人员高度控制,在提供错误信息方面也很有优势。就连微软C#官方的编译器也是手写而成的递归下降语法分析器。
语法分析有自上而下和自下而上两种分析方法
其中
自上而下:递归下降,LL(1)
自下而上:LR(0),SLR(1),LR(1),LALR(1)
递归下降是现阶段主流的语法分析方法,
因为它可以由开发人员高度控制,在提供错误信息方面也很有优势。
。今天介绍的这种方法叫做递归下降(recursive descent)法,这是一种适合手写语法编译器的方法,且非常简单。递归下降法对语言所用的文法有一些限制,但递归下降是现阶段主流的语法分析方法,因为它可以由开发人员高度控制,在提供错误信息方面也很有优势。就连微软C#官方的编译器也是手写而成的递归下降语法分析器。
化成代码就是这样:
Node ParseNode() { int lookAheadIndex = m_index; char lookAheadChar = m_inputString[lookAheadIndex]; if (Char.IsLetter(lookAheadChar)) { //采用N → a(N, N)继续分析 } else if (lookAheadChar == ',' || lookAheadChar == ')' ) { //采用N → ε继续分析 } else { throw new Exception("语法错误"); } |
下面我们要研究一下递归下降法对文法有什么限制。首先,我们必须要通过超前查看进行分支预测。支持递归下降的文法,必须能通过从左往右超前查看k个字符决定采用哪一个产生式。我们把这样的文法称作LL(k)文法
/AtiPlatf_cms/src/com/attilax/ast/AstBuilder.java
List<Token> tokens;
intm_index=0;
public Expression buildAstV2(List<Token> tokens) {
this.tokens = tokens;
// System.out.println(AtiJson.toJson(tokens));
List<String> tokens_slice_li = Lists.newLinkedList();
String stat = "ini";
MethodInvocation mi = new MethodInvocation();
Expression exp;
boolean isConstrutsced = false; // qaa is first
boolean isNewDysnInvoke = false;
boolean isStaticInvoke = false;
Token cur = tokens.get(m_index);
if (cur.getText().equals("(") && cur.getType().equals("op"))
{
stat = "brkStart";
String text = tokens.get(m_index - 1).getText();
//newxx first
if (isNewOpV2(tokens) && isConstrutsced == false)// newxxx
{
String className = javaUtil.clr(text);
mi.Exp = getClassInstance(className);
while (true) {
m_index++;
cur = tokens.get(m_index);
if (cur.getText().equals("(") && cur.Type.equals("op")) {
mi.Name=tokens.get(m_index-1).getText();
//return mi;
break;
}
}
// param push
while (true) {
m_index++;
cur = tokens.get(m_index);
if (cur.getText().equals(")") && cur.Type.equals("op")) {
break;
}
mi.arguments.add(cur.Text);
}
return mi;
}
if (isConstrutsced == false) { // static //first
// new method invoke exp
String className = refx.getClassName(text);
className = javaUtil.clr(className);
mi.Exp = new SimpleName(className); // cls name
mi.Name = refx.getMethodName(text);
isConstrutsced = true;
// param push
while (true) {
m_index++;
cur = tokens.get(m_index);
if (cur.getText().equals(")") && cur.Type.equals("op")) {
break;
}
mi.arguments.add(cur.Text);
}
return mi;
}
// new xxx() meth.chain
/*
* if(mi.Name.equals("__con")) mi.Name=text; else //static ,meth
* chain { MethodInvocation tmp=(MethodInvocation) mi.clone();
* MethodInvocation mi_Outer_new = new MethodInvocation();
* mi_Outer_new.Exp=tmp; mi_Outer_new.Name=text; mi=mi_Outer_new; }
* tokens_slice_li = Lists.newLinkedList(); continue;
*/
// tokens_slice_li = Lists.newLinkedList();
// continue;
}
m_index++;
return buildAstV2(tokens);
}
自己动手开发编译器(七)递归下降的语法分析器 - 装配脑袋 - 博客园.html
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
Atiend
Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法...相关推荐
- Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725
Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725 1. DSL主要分为三类:外部DSL.内部DSL,以及语言工作台. 1 2. DSL ...
- 编译原理中词法分析的递归下降分析法实例--能被5整除的二进制数---c语言实现
一.前言 又到了一周一度的编译原理实验课,一次实验课上完了,又是大学生必备技能-写实验报告.行了,废话不多说,我直接展现,如何实现编译原理中词法分析的递归下降分析法实例–能被5整除的二进制数的思路.作 ...
- 「BUAA OO Unit 1 HW4」第一单元总结 —— 递归下降思想处理表达式
「BUAA OO Unit 1 HW4」第一单元总结 目录 Part0 前言 0.1 文章简介 0.2 阅读本文后将有的收获 0.3 阅读本文需要的前置知识 Part1 第一次作业 1.1 程序框架 ...
- Atiitt 可视化 报表 图表之道 attilax著 Atiitt 可视化的艺术 attilax著 v2 s51.docx Atitit.可视化与报表原理与概论 1. 、什么是可视化(这一
Atiitt 可视化 报表 图表之道 attilax著 Atiitt 可视化的艺术 attilax著 v2 s51.docx Atitit.可视化与报表原理与概论 1. .什么是可视化(这一节有点 ...
- SDM原理解读与工程实践
SDM原理解读与工程实践 本文主要介绍的是阿里在召回阶段使用的深度召回模型SDM,paper名称为<SDM: Sequential Deep Matching Model for Online ...
- 计算机网络中的安全、常见攻击、以及HTTPS原理与抓包实践
文章目录 计算机网络中的安全.常见攻击.以及HTTPS原理与抓包实践 计算机网络中的安全 什么是安全? 报文机密性 - 我们的谈话会被窃听吗? 报文完整性 - 我收到的报文被篡改过吗? 端点鉴别 - ...
- 基于设计原理与理念和实践的ElasticSearch学习、ELK日志收集、网盘搜索引擎
目录 基于设计原理与理念和实践的ElasticSearch学习 一.ES基础入门 ElasticSearch是什么? ES优点: ES缺点: ElasticSearch应用场景 ElasticSear ...
- 基于C++的递归下降语法分析设计原理与实现
资源下载地址:https://download.csdn.net/download/sheziqiong/85949206 资源下载地址:https://download.csdn.net/downl ...
- 条件随机场(CRF)极简原理与超详细代码解析
条件随机场(CRF)极简原理与超详细代码解析 1. 原理 1.1 从名称说起 1.2 优化的目标 1.3 如何计算 2. 代码 2.1 基本结构 2.2 模型初始化 2.3 BERT提取的特征如何输入 ...
- 【编译原理】编译原理系统学习与实践系列文章汇总目录(持续更新中)
本文属于「编译原理」系列文章的汇总目录,这一系列正式开始于2021/10/22,着重于「编译原理的学习与实践」.众所周知,编译原理难学难精,因此本系列将至少持续到作者本人「精通编译原理」为止(笑).由 ...
最新文章
- 微软服务器sql server,解析:微软SQL Server 2008特性和功能
- 机器学习如何彻底改变游戏中的物理模拟
- DevC++连接MySQL,使用mysql.h可用详细教程
- 30 分钟学会如何使用 Shiro
- OpenCV自定义CN跟踪器
- 影院平台搭建 - (7)读多写少数据的缓存
- 计算机二级C语言冲刺笔记。
- 关于iOS实现前台,后台,锁屏或关闭app语音播报
- Lena.jpg 与图像处理的渊源
- 无线测温系统在高低压开关柜内的运行---安科瑞 顾城
- 基于雷电模拟器利用python制作手游脚本 (神都夜行录,古剑奇谭木语人) (一)
- 海信智能电视如何看电视直播
- 2020年手机性能榜大洗牌:小米10 Pro勇夺第一!
- Could not find parameter map com.itcast.mapper.userinfMapper.map
- RTP(实时传输协议)
- Google JavaScript规范
- 罗裳轻解,看C++怎样拥java入怀……
- [问题已解决]你申请的名称指向特定地域范围或地理名称,请提供相应资料证明可使用该地域范围或地理名称作为帐号名称
- Android电子书阅读器开发笔记(1):创建电子书阅读器项目
- 假如唐诗评选第一,您选哪一首?大数据排名前10的唐诗您知道吗