转载地址:http://blog.csdn.net/tyler_download/article/details/50708807

视频地址:http://study.163.com/course/courseLearn.htm?courseId=1002830012#/learn/video?lessonId=1003210315&courseId=1002830012

代码地址 : https://pan.baidu.com/s/1sjWiwPn

正文内容

语法和解析树:

举个例子看看,语法解析的过程。句子:“我看到刘德华唱歌”。在计算机里,怎么用程序解析它呢。从语法上看,句子的组成是由主语,动词,和谓语从句组成,主语是“我”,动词是“看见”, 谓语从句是”刘德华唱歌“。因此一个句子可以分解成 主语 + 动词 + 谓语从句:

句子-->主语+动词 + 谓语从句

主语是名词,因此有 :

主语->名词

句子里的名词有: “我”, “刘德华”,因此有解析规则:

名词-> "我“  |  "刘德华".

句子里的动词是“看见”, “唱歌”,由此有解析规则:

动词-> “看见” | “唱歌”

再看谓语从句,谓语从句由宾语和谓语动词组成, 宾语是 “刘德华”, 谓语动词是“唱歌", 谓语从句的解析规则就是:

谓语从句 -> 宾语 + 谓语动词

谓语动词是属于动词,于是又有:

谓语动词-> 动词

动词->”看见” | "唱歌"

这样,整个句子的解析规则就有:

1.句子-->主语+动词 + 谓语从句

2.谓语从句 -> 宾语 + 谓语动词

3.主语->名词

4.谓语动词->动词

5.动词-> “看见” | “唱歌”

6.名词-> "我“  |  "刘德华".

上面这组解析规则就是在计算机中用来解析句子的算法,接下来我们通过一系列替换,从这组规则还原回句子,首先从第一个规则开始,用右边的式子替换左边的符号,

1. 句子 通过规则 :句子-->主语+动词 + 谓语从句 替换得到:

2. 主语+动词 + 谓语从句, 通过规则 主语->名词 替换得到:

3. 名词 + 动词 + 谓语从句, 通过规则 名词-> "我“  |  "刘德华" 替换得到

4. 我 + 动词 + 谓语从句, 通过规则 动词-> "看见" 替换得到:

5. 我 看见 + 谓语从句, 通过规则 谓语从句 -> 宾语 + 谓语动词 替换得到:

6. 我 看见 宾语+谓语动词, 通过规则 宾语->名词 替换得到:

7. 我 看见 名词+谓语动词, 通过规则 名词-> "我“  |  "刘德华" 替换得到:

8. 我 看见 刘德华 + 谓语动词, 通过规则 谓语动词->动词 替换得到:

9. 我 看见 刘德华 动词。通过规则 动词-> “唱歌” 替换得到

10 我 看见 刘德华 唱歌

至此,我们已经没有可替换的地方,于是语法解析完成。 由此可见,语法解析就是通过设立一组规则,然后判断输入的文本是否符合给定规则的过程。我们看到,最底层的一些规则是这样的:

名词-> "我“  |  "刘德华", 动词-> “看见” |“唱歌“

这几条规则,其实就是以前(http://blog.csdn.net/tyler_download/article/details/50668983)所说的词法分析,-> 左边就是标签,右边就是词法分析的字符串。整个解析过程,形成了一种树状结构,这个结构就叫语法解析树:

设想,由文字组成的文本,其形式是无穷的,语法解析的规则是将无穷的文本中,选取出组合形式符合语法规则的文本,例如对于上述语法,句子:“我看见张学友唱歌” 就无法通过语法规则,按照上面的替换过程,我们发现,到第7步时 解析到宾语,宾语替换成名词后无法将名词替换成“张学友”, 因此“我看见张学友唱歌”对于上面的语法规则而言,是非法输入。

当然,语法规则所限定的文本输入也不是唯一的,句子:“刘德华看见我唱歌” 也符合上面的语法规则,大家可以仿照上面的替换过程验证一下。

如果想要语法识别“我看见张学友唱歌”, 那么只要将规则改一下:名词->”我“ | ”刘德华” | “张学友” 即可。

我们看看,将上述替代过程转成计算机伪码是怎样的:

假定“我看见刘德华唱歌” 这歌句子存在缓冲区buffer 里,那么代码表述如下:

句子(buffer) {

//主语 + 动词 + 谓语从句 替换 句子

主语(buffer);

动词(buffer);

谓语从句(buffer);

}

主语(buffer) {

//名词 替换 主语

名词(buffer);

}

名词(buffer) {

// “我” | “刘德华” 替换 名词

if (buffer[0] == “我”) {

buffer = buffer.substring(1);

return;

}

if (buffer[0,1,2] == “刘德华”) {

buffer = buffer.substring(3);

return;

}

throw new Exception (“该语句不符合语法”);

}

动词(buffer) {

// “看见” | “唱歌“ 替换 动词

if (buffer[0,1]== “看见” || buffer[0,1] == “唱歌") {

buffer = buffer.substring(2);

return;

}

throw new Exception (“该语句不符合语法”);

}

谓语从句(buffer) {

//宾语 谓语动词 替换 谓语从句

宾语(buffer);

谓语动词(buffer);

}

宾语(buffer) {

//名词 替换 宾语

名词(buffer);

}

谓语动词(buffer) {

//动词 替换 谓语动词

动词(buffer);

}

在下一篇,我们看看,如何对带有加好和乘号的算术表达式,如何制定一套语法规则以及相应的语法替换代码。

(3) 用java编译器实现一个简单的编译器-语法分析相关推荐

  1. java简单编译器源代码_25行代码实现一个简单的编译器

    起因 <25行JavaScript语句实现一个简单的编译器>实现的是一个简单到不能再简单的玩具的玩具,他的魔法是函数式编程简化了js代码.java 8提供了函数式编程的支持,昨晚脑子抽风突 ...

  2. java实现编译器_实现一个简单的编译器

    简单的说 编译器 就是语言翻译器,它一般将高级语言翻译成更低级的语言,如 GCC 可将 C/C++ 语言翻译成可执行机器语言,Java 编译器可以将 Java 源代码翻译成 Java 虚拟机可以执行的 ...

  3. 实现一个简单的编译器

    简单的说 编译器 就是语言翻译器,它一般将高级语言翻译成更低级的语言,如 GCC 可将 C/C++ 语言翻译成可执行机器语言,Java 编译器可以将 Java 源代码翻译成 Java 虚拟机可以执行的 ...

  4. JAVA同时输入用户名和密码_用java模拟设计一个简单的“用户注册”程序。当用户输入用户名和密码时,单击“注...

    用java模拟设计一个简单的"用户注册"程序.当用户输入用户名和密码时,单击"注 2020 - 9 - 26 TAG : 所有功能均已实现,如有不满意的地方我再修改imp ...

  5. JAVA编写的一个简单的Socket实现的HTTP响应服务器

    JAVA编写的一个简单的Socket实现的HTTP响应服务器,看后就很容易理解Web服务器的原理了. package test.io;import java.net.*; import java.io ...

  6. Qt实现一个简单的编译器(软件生成器)

    Qt实现一个简单的编译器(软件生成器) 本文章只记录如何用Qt实现一个简单编译器,即点击本软件中的按钮便可在另一目录中生成一个新的软件(与本软件不冲突). 文章目录 Qt实现一个简单的编译器(软件生成 ...

  7. 用java设计实现一个简单的动作冒险类游戏

    用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...

  8. java设计游戏_用java设计实现一个简单的动作冒险类游戏

    用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...

  9. java Swing 做一个简单的输入文本框

    java Swing做一个简单的文本输入框, 新建一个SwingDemo类: // //java swing做一个简单的文本框 //Created by lee_1310 on 2019.03.29 ...

最新文章

  1. 随机邻域嵌入_「论文阅读」-学习用于通勤流嵌入的地理上下文嵌入
  2. mysql去掉秒杀场景_秒杀场景下mysql减库存逻辑优化
  3. P1192 台阶问题(递推)
  4. Maven项目启动时如何查找默认的显示页面
  5. 超出内容用省略号替代
  6. native.loadlibrary获取路径不对_【Python专题(三)】Python模块导入与路径管理
  7. 给程序员的10条建议,句句经典
  8. TensorFlow会话的配置项
  9. pip安装其他包报错
  10. get和post方式传递参数
  11. 怎么查江苏省计算机一级成绩,江苏省计算机一级查询成绩在哪里查-江苏省计算机一级查询成绩查询网址-常州宝...
  12. MVC项目开发中那些用到的知识点(Ajax.BeginForm)
  13. java中求平方函数和开方函数
  14. 深度学习与人脸识别系列(3)__利用caffe训练深度学习模型
  15. Java并发编程学习-日记1、常见的IO模型、NIO、OIO
  16. RPG Maker mv框架代码解析之窗口文字显示
  17. hdu2072单词数(思维)
  18. 2021年新西兰经济发展研究报告
  19. 如何快速搞定一篇期刊论文
  20. twisted学习笔记

热门文章

  1. Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  2. dart系列之:dart类的扩展
  3. Scala教程之:静态类型
  4. SpringBoot整合mybatis进行快速开发
  5. ChubaoFS:一个面向大规模容器平台的分布式文件系统
  6. 操作系统(1) -- 计算机系统概述
  7. 【四种解法】剑指 Offer 39. 数组中出现次数超过一半的数字
  8. OSPF简单多区域及末梢区域配置
  9. java登录注册升级代码_【升级版】Java 登录,注册,传数据到后台小案例
  10. 如何查看一个现有的keil工程之前由什么版本的keil IDE编译