我正在使用Flex和Bison作为解析器生成器,但我的扫描仪中的启动状态出现问题。
我使用独家规则来处理评论,但这个语法似乎与引用的标记不匹配:
%x COMMENT
// { BEGIN(COMMENT); }
<COMMENT>[^\n] ;
<COMMENT>\n { BEGIN(INITIAL); }
"==" { return EQUALEQUAL; }
. ;
在这个简单的例子中,行:
// a == b
除非我包含此规则,否则不完全匹配评论:
<COMMENT>"==" ;
如何在不必将所有这些令牌添加到我的独家规则中的情况下解决这个问题?
答案 0 :(得分:9)
在Lex / Flex中匹配C风格的注释或者有详细记录的内容:
in the documentation,以及互联网的各种变体。
以下是Flex文档中的变体:
<INITIAL>{
"//" BEGIN(IN_COMMENT);
}
<IN_COMMENT>{
\n BEGIN(INITIAL);
[^\n]+ // eat comment
"/" // eat the lone /
}
答案 1 :(得分:2)
尝试在[^ n]规则后添加“+”。我不知道为什么独家国家即使在一个独家国家仍然拿起'==',但显然它是。 Flex通常会匹配与大多数文本匹配的规则,而添加“+”将至少使两个规则的长度相关。将COMMENT规则放在第一位将导致在并列情况下使用它。
答案 2 :(得分:0)
线索是:
问题是这个'吃评论' 规则似乎与令牌不匹配 多个角色
所以添加一个*以匹配零个或多个非换行符。你想要零,否则空的评论将不匹配。
%x COMMENT
// { BEGIN(COMMENT); }
<COMMENT>[^\n]* ;
<COMMENT>\n { BEGIN(INITIAL); }
"==" { return EQUALEQUAL; }
. ;