Loading

词法分析——贪心法

1.提出问题

  C语言的某些符号,例如 /、* 和 = ,只有一个字符长,称为单字符符号

  而C语言中的其他符号,例如 /* 和 == ,以及标识符,包括了多个字符,称为多字符符号

  当C编译器读入一个字符 ' / ' 后又跟了一个字符 ' * ',那么编译器就必须做出判断:是将其作为两个分别的符号对待,还是合起来作为一个符号对待。

2.解决问题

  C语言对这类问题的规则可以归纳为:每一个符号应该包含尽可能多的字符。这个处理策略有时被称为“贪心法”,或者“大嘴法”。

  详细说来就是:编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已经不可能组成一个有意义的符号。

  标准表述:如果(编译器的)输入流截至至某个字符之前都已经被分解为一个个符号,那么下一个符号将包括从该字符之后可能组成一个符号的最长字符串

3.注意

  除了字符串与字符常量,符号的中间不能嵌有空白(空格符、制表符和换行符)。

  例如:== 和 = = 不同;a---b 和 a-- -b相同,和 a- --b不同。

  这些类似准二义性(near-ambiguity)问题

posted @ 2019-03-26 22:54  取映  阅读(260)  评论(0编辑  收藏  举报