欲练神功,必先看数据结构(图必看),内功心法之葵花宝典 最近在看葵花宝典(编译原理),买了本龙书来看,但是怎么看也看不明白,之后小女我先照的自己的想法写了一次,然后写的时候见的问题,在书中都可以找的到,这样我就看懂龙书了.在此写点东西给大家参考.

先看看什么是状态机,上图就是状态机

解答上图:识别一个字符串 I am a boy 首先是状态-是否是空格,然后是-是否是新的单词,只要这两种状态就行了.用两个指针    char* lexemBegin    char* lexemEnd 指向单词的开始:

I          am       a        boy

↑         ↑

lexemBegin    lexemEnd

然后用指针, lexemEnd读取一个字符,如读I,然后状态 是否是新的单词=是 ,读空格 是否是空格=是,然后就可以判定一个单词的结束.

以上是原理:然后给出代码

typedef struct scrWord{//这是一个单词表,之后还要用在语义分析char data[100];int len;scrWord* next;scrWord* S;//非中终符

}scrWord;void cpystr(char* des ,char* scr,int len){   for(int i=0;i<len;i++){*des=*scr;des++;scr++;}}bool cmptostr(char* scr ,char* lexemBegin ,int len){//单词比较,这里先自己写着行,之后用kmp 算法替换(这样速度快)for(int i=0;i<len;i++){if(tolower(*scr)!=tolower(*lexemBegin))return false;lexemBegin++;scr++;}return true;}void toker(char* cinput ,scrWord *wordTable){// cinput输入的单词, wordTable单词表之后讲解int Wordlen=strlen(cinput);//得到输入串的长度
scrWord *lpWordTable=wordTable;char* lexemBegin=cinput;//串的开始指针char* lexemEnd=cinput; //串的结束指针bool isNewWord=false;//是否是新词单bool isBreak=true;//是否是空格int count=0;//记录一共有几个单while(*lexemEnd!=';'){if((*(lexemEnd-1))!=' ' &&  (*lexemEnd==' ' || *lexemEnd=='(' || *lexemEnd==')'))//这里之后会改进
isNewWord=true;//
elseisNewWord=false;if((*lexemEnd==' ' || *lexemEnd=='(' || *lexemEnd==')') && isNewWord==true){scrWord *wordTable2=new scrWord();//单词表
memset(wordTable2->data,0,100);//内存初始化
cpystr(wordTable2->data,lexemBegin,lexemEnd-lexemBegin);//单词表
lpWordTable->next=wordTable2;//用链表生成的单词表
lpWordTable->len=lexemEnd-lexemBegin;// 单词长度
lpWordTable=lpWordTable->next;lexemBegin=lexemEnd;}lexemEnd++;if(lexemEnd-lexemBegin>Wordlen){return;}}}int main(int argc, char* argv[]){//调用的例子
scrWord *wordTable=new scrWord();char * str="create table hts(fe int)";toker(str,wordTable);return 0;}

这上为自己写的sql词法分析器,在之后小女将出继编改进词法分析器,并对照龙书.

转载于:https://www.cnblogs.com/baihelianzi/archive/2012/05/15/2501690.html

小女也爱葵花宝典---读懂编译原理(1)相关推荐

  1. 一文读懂BERT(原理篇)

    一文读懂BERT(原理篇) 2018年的10月11日,Google发布的论文<Pre-training of Deep Bidirectional Transformers for Langua ...

  2. 从V1到V4,让你读懂YOLO原理——深度AI科普团队

    文章目录 YOLO概述 模型时间轴 YOLOv1 原理 网络结构 损失函数 激活函数 YOLOv1的缺陷 YOLOv2 Better Batch Normalization(批归一化) High Re ...

  3. Salesforce学习之路-developer篇(五)一文读懂Aura原理及实战案例分析

    很喜欢曾经看到的一句话:以输出倒逼输入.以输出的形式强制自己学习,确实是高效的学习方式,真的很棒.以下仅为个人学习理解,如有错误,欢迎指出,共同学习. 1. 什么是Lightning Componen ...

  4. 一文读懂K-Means原理与Python实现

    目录 一.K-Means原理 1.聚类简介 ①分层聚类 ②质心聚类 ③其他聚类 2.K-means的原理 3.K-means的应用场景 二.K-Means的案例实战 1.数据查看 ①数据导入及结构查看 ...

  5. 【机器学习】机器学习从零到掌握之八 -- 教你读懂决策树原理

    本文是<机器学习从零到掌握>系列之第8篇 机器学习从零到掌握之一 -- 教你理解K近邻算法 机器学习从零到掌握之二 -- 教你实现K近邻算法 机器学习从零到掌握之三 -- 教你使用K近邻算 ...

  6. 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe. 实现Tinymoe的第一步自然是一个词法分析器.词法分析其所作的事情很简单,就是把一份代码分割成若干个token ...

  7. 前端零基础编译原理科普

    本文是 @神说要有光 对编译小白 ssh 的一次答疑解惑,很适合零基础的新手第一次了解编译原理的概念,故分享出来. 近些年,编译原理在前端领域的应用越来越多,大家比较熟悉的有工程化领域各种转译器:ba ...

  8. 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)

    更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,共同探讨软件知识经验,关注就有海量学习资料免费领哦: 目录 0背景 1.手机USB接口通信特点 1.1 使用方便 1.2 通用性强 1.3 ...

  9. 一篇读懂无线充电技术(附方案选型及原理分析)

    更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦: 目录 一篇读懂无线充电技术(附方案选型及原理分析) 0.背景 1.无线供电特 ...

最新文章

  1. angular 应为声明或语句_“允许”员工自愿降薪后,多益网络再发声:声明降薪非自愿者奖 3 万...
  2. FAST300M无线宽带路由器FW300R(从)桥接TPLINK路由器(主)
  3. Python 函数的可变参数、切片、迭代和列表生成式
  4. 简单的解决nginx转发WebSocket问题
  5. 百度文库免积分下载器
  6. listary文件查找工具下载及使用
  7. 非常值得收藏的15个 Google 高级搜索技巧
  8. Intouch2014无法自动启动西门子驱动DASSIDIRECT.EXE的原因及解决办法
  9. 【网络安全】SQL注入详细分析
  10. 【SVN/Visual Studio】清除/更换AnkhSVN的用户登录信息
  11. 董明珠还能任性么?美的和小米如今都彻底击败了格力
  12. SLAM数据集(tum/kitti)轨迹对齐与结果评估
  13. 走,上高架,看看Momenta“飞轮式L4”的“微操”技巧
  14. 彻底解决电脑弹出USB设备时:提示该设备正在使用中无法弹出问题
  15. Airbnb、小猪短租等这类短租类产品发展前景如何?
  16. Word多级标题设置,一级标题是汉字数字,其他级别是阿拉伯数字
  17. 自我介绍及欢迎报考我的研究生
  18. 有5个人坐在一起,问第五个人多少岁?(每一个数字对应的年龄应由上一个数字的年龄决定,考虑采用递归函数解决。)
  19. java编程思想学习笔记(第七章:复用类)
  20. 异常类练习——编写应用程序,从键盘输入两个数作为除数和被除数。捕获NumberFormatException 异常和ArithmeticException 异常,

热门文章

  1. 获得本机IP和访问服务的端口号(Java)
  2. 剑桥少儿英语预备级教案(上) unit10 Let's do it.
  3. python 错误类型
  4. [算法模版]Link-Cut-Tree
  5. 四、spring中高级装配(2)
  6. 关于货仓选址问题的方法及证明(在数轴上找一点使得该点到所有其他点的距离之和最小)...
  7. 【Linux命令大全】
  8. 4.vuex学习之getters、mapGetters
  9. selenium,webdriver 执行js语句 对象是百度
  10. unittest单元测试简单介绍