例:
6.正则表达式转正则文法 G
规则如下:
(1)对任何正则表达式r,选择一个非终结符S作为识别符号,并产生产生式S→r
(2)若x,y是正则表达式:
1.对A→xy,转化为A→xB,B→y,B为新的非终结符
2.对A→x*y,转化为A→xA,A→y(注:对A→x*y,则需要转化为A→xA,A→ε)
3.对A→x|y的产生式
例如:
例:
左线性的话:(会死循环)
3.6 词法分析程序的设计与实现
3.6.1 词法分析原理
说明:
1.对于注释符号是不输出的
2.各单词之间用空白符号(空格、制表、回车)分开
在得知文法后
需要根据文法将所有终结符号的转化过程给绘制出来(初始符号就是每个终结符号)
这里出现的其他字符,实际是任意字符,例如读到+后再读入+,后一个+相对于前一个也是其他字符。
然后将这些转化过程都结合起来,初始状态当做传入的符号串。合并后还需要注意:对重复符号进行特殊处理(单双字符分界符处理合并),还需要一个出错的状态(符号串不属于任一流程)。
3.6.2 词法分析程序的构造
不同状态的做法
开始状态:利用程序依次读入字符,读到空字符就跳过,然后对每一个非空字符串转到程序中进行处理。
标识符状态:在组合成标识符后,判断是保留字还是用户自定义的
整数状态:组成数字后还要做数字字符到二进制数值的转换
单字符分界符状态:判断对应的类别编码即可
冒号状态:需要和下一个字符结合进行判断,是单字符还是双字符
斜竖状态:同样需要判断后面的字符,作为字符还是跳过注释
错误状态:打印错误信息并跳过
注:在词法分析时为了判别是否已经读到了单词的右端符号,有时候需要向前多读一个字符,例如在标识符和无符号整数等状态。这是为了防止跳过某个不该跳过的字符。所以在返回调用程序前应该将读字符指针后退一个字符。(字符指针后退实际就是退到前一个字符,因为在读取字符时可能多读一个字符,导致后面读取时这个字符就被忽略了,所以需要后退(字符指针是一直前进的,后退就是向上一个读的字符吐出来一个))
3.6.3 词法分析程序的实现
一个词法分析程序需要:1.单词及内部表示 2.词法分析程序需要引用的公共(全局)变量和过程 3.词法分析程序算法
1.输出形式:即按单词及内部表示的规定进行(一般是二元式,一个是类别编码,一个是对应的单词值)