lex和yacc
sxqinjh
无冥冥之志者,无昭昭之明;无惛惛之事者,无赫赫之功.
展开
-
yacc学习笔记(五)支持数学函数的计算器程序
支持数学函数的计算器程序为计算器生成的另一个指令是添加用于平方根、指数和对数的数学函数。以如下方式处理输入:s2=sqrt(2)s2=1.41421二种实现方式:方式一、为每个函数添加单独的规则例:语法分析添加:%token SQRT LOG EXP。。。%%expression: ... | SQRT '(' expression ')' { $$=sqrt($3);...原创 2020-03-05 17:45:39 · 654 阅读 · 0 评论 -
yacc学习笔记(四)带符号表的计算器程序
符号表上一篇的计算器程序中的变量名只支持单个字符(a-z), 很少有用户满意单字符变量名,所以现在要增加使用较长变量名的能力。这意味着需要一个符号表——一种用来跟踪使用中的名字的结构。每次记法分析程序读取输入中的名字时,它都在符号表中查找这个名字,并且得到一个对应符号表条目的指针。在程序的其它地方,使用符号表指针而不是名字串,因为每次需要时指针比查找名字更快速更容易。因为符号表要求语法分析程序...原创 2020-03-04 20:28:15 · 633 阅读 · 0 评论 -
yacc学习笔记(三)变量和有类型的标记
变量和有类型的标记yacc不仅可以用%token定义标记,而且可以用%type token为标记指定类型,其中需要是在%union中声明的类型,token为已由%token定义的标记名。下面用带类型的变记扩展之前的计算器来处理具有单个字母名字的变量。因为只有26个字母(目前只关心小写字母),所以我们能在26个条目的数组中(称它为vbltable)存储变量。为了使计算器更有用,也可以扩展它...原创 2020-03-04 16:32:29 · 1536 阅读 · 2 评论 -
yacc学习笔记(二)算术表达式歧义性和优先级
一个含歧义性的表达式示例:expression: expression '+' expression { $$=$1+$3; } | expression '-' expression { $$=$1-$3; } | expression '*' expression { $$=$1*$3; } | expression '/' expression { if($3==...原创 2020-03-02 18:35:35 · 909 阅读 · 0 评论 -
yacc学习笔记(一)基础语法
yacc的功能:sql解析中的语法分析工具,和flex配合使用。yacc不能分析什么:1、不能处理歧义语法,在歧义语法中,同样的输入符合多个分析树2、不能处理需要向前看多于一个标记才能确定它是否已经匹配一条规则的语法。yacc语法分析程序结构:定义段:处理yacc生成的语法分析程序的控制信息,建立语法分析程序的执行环境规则段:包含语法分析程序的规则;代码段:被逐字拷贝到生成的C程序...原创 2020-03-01 19:34:00 · 4041 阅读 · 0 评论 -
lex学习笔记-工具安装及基本语法
lex语法分析程序消除歧义的两条规则:1、lex只匹配输入字符或字符串一次;2、lex执行当前输入的最长可能匹配的动作。例:“island”是比"is"长的匹配,所以lex把“island”看作匹配上面那条包括一切的规则。...原创 2020-03-01 17:20:14 · 1355 阅读 · 0 评论