加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

词法分析——编写Flex源代码

发布时间:2020-12-15 04:23:47 所属栏目:百科 来源:网络整理
导读:? ? ? ? 首先,我们需要一份C--的Grammar,基于这个Grammar,进行代码的编写: ? ? ? ? 在这里,INT和FLOAT都是无符号的,也就是说是非负的。其次,对于INT的实现,可以加入八进制和十六进制的实现,FLOAT的实现,可以加入指数形式的实现。这些都是很简单的

? ? ? ? 首先,我们需要一份C--的Grammar,基于这个Grammar,进行代码的编写:


? ? ? ? 在这里,INT和FLOAT都是无符号的,也就是说是非负的。其次,对于INT的实现,可以加入八进制和十六进制的实现,FLOAT的实现,可以加入指数形式的实现。这些都是很简单的,将正则表达式写对就OK了。

? ? ? ??Flex输入文件包括3个部分,通过“%%”隔开,如下面代码所示:?

{definition}

%%

{rules}

%%

{user subroutines}

? ? ? ? 其中,{definition}是定义部分,实际上就是在给某些后面可能经常用到的正则表达式取一个别名,从而简化词法规则的书写。定义部分的格式一般为:

name definition

? ? ? ? 如: ? digit ? [0-9] ? ? ? ? ? ? ? ? ? ? 或者 ? ? ? ? ? ? ? ? ? ? ? ?letter ? ?[_a-zA-Z]

? ? ? ??Flex源代码的第二部分为规则部分。它由正则表达式和相应的响应函数组成,格式为:

pattern {action}

? ? ? ? pattern为正则表达式,其书写规则与声明部分的正则表达式相同。action为将要进行的具体操作,这些操作可以用一段C代码表示。Flex将按照这一部分给出的内容依次尝试每一个规则,尽可能匹配最长的输入串。如果有些内容不匹配任何规则,那么Flex 默认只将其拷贝到标准输出,想要修改这个默认行为的话只需要在所有规则最后加上一
条“.”(匹配任何输入)规则,然后在对应的action部分书写你想要的行为既可。

? ? ? ? 在John Levine的著作flex&bision中有这样一个例子:Unix/Linux下有一个常用的文字统计工具wc,它可以统计一个或者多个文件中的(英文)字符数、单词数和行数。使用Flex来可以让我们快速地写出一个类似的文字统计程序:

%{?
? /* 此处省略#include部分 */?
? int chars = 0;?
? int words = 0;?
? int lines = 0;?
%}?
letter ?[a-zA-Z]?
?
%%?
?
{letter}+ ?{ words++; chars+= yyleng; }?
n ? ? ?{ chars++; lines++; }?
. ? ? ?{ chars++; }?
?
%%?
?
int main(int argc,char** argv)?
{?
? if (argc > 1)?
? {?
? ? if (!(yyin = fopen(argv[1],“r”)))?
? ? {?
? ? ? perror(argv[1]);?
? ? ? return 1;?
? ? }?
? }?
? yylex();?
? printf(“%8d%8d%8dn”,lines,words,chars);?
? return 0;?
}

? ? ? ? 有了上面的内容后,就可以实现我们的词法分析了。

参考内容:许畅老师班的《指导攻略1》

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读