flex有问题请教

发布于 2022-09-19 12:36:49 字数 1139 浏览 17 评论 0

%x CCOMMENT
%x LCOMMENT
W [ \t\b\f\r]+

%%

^"#line"[ ]+\"[^\"]*\"[ ]+[0-9]+.* { line_directive(); }
^"`line"[ ]+[0-9]+[ ]+\"[^\"]*\".* { line_directive2(); }

[ \t\b\f\r] { ; }
\n { yylloc.first_line += 1; }

  /* C++ style comments start with / / and run to the end of the
     current line. These are very easy to handle. */

"//".* { comment_enter = YY_START; BEGIN(LCOMMENT); }
<LCOMMENT>.    { yymore(); }
<LCOMMENT>\n   { yylloc.first_line += 1; BEGIN(comment_enter); }

  /* The contents of C-style comments are ignored, like white space. */

"/*" { comment_enter = YY_START; BEGIN(CCOMMENT); }
<CCOMMENT>.    { yymore(); }
<CCOMMENT>\n   { yylloc.first_line += 1; yymore(); }
<CCOMMENT>"*/" { BEGIN(comment_enter); }

请问这里标志的CCOMMENT什么意思,如何理解上面所识别的语句,请高手解释下??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

此生挚爱伱 2022-09-26 12:36:49

%x表示该状态下,只匹配该状态的内容,默认下(前面没有状态名的任何匹配)的任何东西不计入匹配.
例如,
如果前面有个
%x STAT1
当前状态为STAT1
有个通用的匹配为
xxxxx {.....}
则这一段匹配不起作用
当前只认识
<STAT1>xxxxx{.....}
这样的匹配

只是偏爱你 2022-09-26 12:36:49

看来版主在这方面很有造诣,小弟最近正在学这方面的知识,希望能得到指点一二

百思不得你姐 2022-09-26 12:36:49

另问一下:
1.flex与lex,bison和yacc其用法是否是兼容的。
2.下面语句片断,执行是如何进行的?

^"#line"[ ]+\"[^\"]*\"[ ]+[0-9]+.* { line_directive(); }
^"`line"[ ]+[0-9]+[ ]+\"[^\"]*\".*             { line_directive2(); }
[ \t\b\f\r]                                                    { ; }
\n                                                               { yylloc.first_line += 1; }
"//".*                                                          { comment_enter = YY_START; BEGIN(LCOMMENT); }
<LCOMMENT>.                                           { yymore(); }
<LCOMMENT>\n                                         { yylloc.first_line += 1; BEGIN(comment_enter); }

一个疑问是,上面语句片断的执行是否是这样的:第一步
1.匹配

]^"#line"[ ]+\"[^\"]*\"[ ]+[0-9]+.*


得到匹配时执行动作

line_directive();

第二步
2.匹配

^"`line"[ ]+[0-9]+[ ]+\"[^\"]*\".*

           
得到匹配时执行动作

line_directive2();

第三步
3.匹配

[ \t\b\f\r]

得到匹配时执行动作

;

4.匹配

\n


得到匹配时执行动作

yylloc.first_line += 1;

5.匹配

"//".*

得到匹配时执行动作

comment_enter = YY_START; BEGIN(LCOMMENT);

6.匹配<LCOMMENT>.
得到匹配时执行动作

yymore();

7..匹配<LCOMMENT>\n
得到匹配时执行动作

yylloc.first_line += 1; BEGIN(comment_enter); }

其中,

"//".*                                              { comment_enter = YY_START; BEGIN(LCOMMENT); }
<LCOMMENT>.                                           { yymore(); }
<LCOMMENT>\n                                         { yylloc.first_line += 1; BEGIN(comment_enter); }

是否等价于匹配注释串,
"//".+\n
但是用条件LCOMMENT的作用在于可以将动作分解。

橘虞初梦 2022-09-26 12:36:49

最大程度的匹配谁就用谁

满地尘埃落定 2022-09-26 12:36:49

遵循自顶至低最大匹配原则的

夜司空 2022-09-26 12:36:49

说的最大程度的匹配是不是指的"贪吃蛇"的算法!

李不 2022-09-26 12:36:49

我还是说错了。
LEX语言应该是自顶向下匹配。
越上优先级越高。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文