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  递归下降是现阶段主流的语法分析方法的更多相关文章

  1. Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725

    Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓  O725 1. DSL主要分为三类:外部DSL.内部DSL,以及语言工作台. 1 2. DSL ...

  2. Atitit. 拉开拉链zip文件 最佳实践实施 java c# .net php

    Atitit. 拉开拉链zip文件 的实现最佳实践 java c# .net php 1. Jdk zip 跟apache ant zip 1 2. Apache Ant包进行ZIP文件压缩,upzi ...

  3. Atitit.提升语言可读性原理与实践

    Atitit.提升语言可读性原理与实践 表1-1  语言评价标准和影响它们的语言特性1 1.3.1.2  正交性2 1.3.2.2  对抽象的支持3 1.3.2.3  表达性3 .6  语言设计中的权 ...

  4. Atitit.异步编程技术原理与实践attilax总结

    Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...

  5. Atitit 图像处理--图像分类 模式识别 肤色检测识别原理 与attilax的实践总结

    Atitit 图像处理--图像分类 模式识别 肤色检测识别原理 与attilax的实践总结 1.1. 五中滤镜的分别效果..1 1.2. 基于肤色的图片分类1 1.3. 性能提升2 1.4. --co ...

  6. Atitit.异常的设计原理与 策略处理 java 最佳实践 p93

    Atitit.异常的设计原理与 策略处理 java 最佳实践 p93 1 异常方面的使用准则,答案是:: 2 1.1 普通项目优先使用异常取代返回值,如果开发类库方面的项目,最好异常机制与返回值都提供 ...

  7. Atitit.软件研发团队建设原理与概论 理论

    Atitit.软件研发团队建设原理与概论 理论 培训 团队文化建设(内刊,ppt,书籍,杂志等) 梯队建设 技术储备人才的问题 团队建设--小红花评比. 团队建设--文化墙.doc 户外拓展 1. 团 ...

  8. Atitit.可视化与报表原理与概论

    Atitit.可视化与报表原理与概论 1.  信息可视化1 2. Gui可视化1 3. 报表系统(三大图表,金字塔,组织结构图等)1 4. <可视化数据>目录3 5. 可视化的具体实现(c ...

  9. Atitit.html css  浏览器原理理论概论导论attilax总结

    Atitit.html css  浏览器原理理论概论导论attilax总结 1.1. 浏览器是怎样工作的:渲染引擎,HTML解析(连载二)1 2. 5.1.1 DOM标准 1011 3. <We ...

随机推荐

  1. session和cookie的简单理解

    0. 引子,我们为什么要cookie和session       因为http请求是无状态的(不能记录用户的登录状态等),所以需要某种机制来保存用户的登录状态等信息,在下次访问web服务的时候,不用再 ...

  2. redis sentinel基本命令与参数

    1.redis基本命令1)获取sentinel的状态(1)info查看sentinel的状态(2)sentinel masters 获取sentinel中监控的所有master的节点(3)sentin ...

  3. lvs-keepalived故障记录

    上图中1与2.3不同,可能会导致端口不同,尽量配置1.2.3相同

  4. 关于mock server

    这篇技术博客是在知乎上看到的 知乎js大神张云龙写的 这里贴过来记录下,如果侵权 请告知将及时删除. --------------------------- 为了更好的分工合作,让前端能在不依赖后端环 ...

  5. Swift语法简介(一)

    或许网络上有很多成型的介绍,我只想写下来留给自己.欢迎批评.开撸! 1.第一个程序,Hello,world!古人云,学会了Hello,world!这门语言你就掌握了一半了. print("H ...

  6. reduce方法

    API里面这样写 reduce(initial, sym) → obj                              reduce(初始值,符号) reduce(sym) → obj re ...

  7. TSP旅行商问题的Hopfield求解过程

      连续型Hopfield在matlab中没有直接的工具箱,所以我们们根据Hopfield给出的连续行算法自行编写程序.本文中,以求解旅行商 问题来建立Hopfield网络,并得到解,但是该解不一定是 ...

  8. 【转载】Bandits for Recommendation Systems (Part I)

    [原文链接:http://engineering.richrelevance.com/bandits-recommendation-systems/.] [本文链接:http://www.cnblog ...

  9. form表单回车提交

    当form中只有一个input[type="text"](其他的表单元素可以随意有)的输入框时候,当input[type="text"]获得焦点的时候,无论表单 ...

  10. PYTHON学习之路_PYTHON基础(3)

    学习内容: 1.Python字典 2.Python集合 3.Python字符编码 4.Python文件操作 5.Python实例 一.Python字典 1.定义: dic1={'name':'alex ...