我想在flex中制定规则来使用像/**/这样的c风格的注释
我有以下内容
c_comment "/*"[\n.]*"*/"
Run Code Online (Sandbox Code Playgroud)
但它永远不会匹配.知道为什么吗?如果您需要更多我的代码请告诉我,我会提交整件事.感谢任何回复的人.
zne*_*eak 42
我建议你改用起始条件.
%x C_COMMENT
"/*" { BEGIN(C_COMMENT); }
<C_COMMENT>"*/" { BEGIN(INITIAL); }
<C_COMMENT>\n { }
<C_COMMENT>. { }
Run Code Online (Sandbox Code Playgroud)
请注意,规则和规则之间不能有任何空格<condition>.
%x C_COMMENT定义C_COMMENT状态,规则/*启动它.一旦启动,*/它将返回到初始状态(INITIAL已预定义),并且所有其他角色将在没有任何特定操作的情况下被消耗.当两个规则匹配时,Flex通过采用具有最长匹配的规则来消除歧义,因此点规则不会阻止*/匹配.该\n规则是必要的,因为点匹配除换行符之外的所有内容.
该%x定义使C_COMMENT成为一个独占状态,这意味着词法分析器只匹配<C_COMMENT>一旦进入状态就被"标记"的规则.
这是一个很小的示例词法分析器,它通过打印除了内部的所有内容来实现这个答案/* comments */.
这是一个例子,以防万一有人对如何工作zneak的答案感到困惑:
(基本上,你将"%x C_COMMENT"放在第一部分,其余部分放在第二部分,正如他的有用链接所解释的那样)
foo.l
%{
// c code..
%}
%x C_COMMENT
%%
"/*" { BEGIN(C_COMMENT); }
<C_COMMENT>"*/" { BEGIN(INITIAL); }
<C_COMMENT>. { }
%%
// c code..
Run Code Online (Sandbox Code Playgroud)
希望有人帮助!斗嘴
不知道为什么它没有被拾取但我确实知道那种模式可以产生大的词汇元素.只检测开始注释标记并在bitbucket中抛出所有内容直到找到结束标记更有效.
这个站点有代码可以做到这一点:
"/*" {
for (;;) {
while ((c = input()) != '*' && c != EOF)
; /* eat up text of comment */
if (c == '*') {
while ((c = input()) == '*')
;
if (c == '/')
break; /* found the end */
}
if (c == EOF) {
error ("EOF in comment");
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)