我正在尝试找出问题的根本原因。我有以下需要解析的行 -
sample format "string";
需要对sample
和format
进行标记,并且需要将提取的逗号中的任何内容提供给Parser文件。
但是,如果我在字符串中有一个perl样式注释#
,那么我会收到错误。
在lexer.l
中,我有以下内容 -
stringIdentifier [^"]+
<STRING_S>{stringIdentifier} {
strncpy(yylval.str, yytext,1023);
yylval.str[1023] = '\0';
return IDENTIFIER;
}
<*>"//".* {
}
<*>"#".* {
}
<INITIAL>{s}{a}{m}{p}{l}{e} {
BEGIN(SAMPLE_S);
return SAMPLE;
}
<SAMPLE_S>{f}{o}{r}{m}{a}{t} {
return FORMAT;
}
<SAMPLE_S>"\"" {
BEGIN(STRING_S);
return INVERTED_COMMA;
}
<STRING_S>"\"" {
BEGIN(INITIAL);
return INVERTED_COMMA;
}
在Parser.y
我有以下规则:
pass : SAMPLE FORMAT INVERTED_COMMA IDENTIFIER INVERTED_COMMA
{
};
但是,当我给sample format "abc;"
时,它可以正常工作,但是当我在字符串中添加注释字符#
时,它会失败。你能帮忙解决这个问题吗?
答案 0 :(得分:0)
答案取决于您使用默认 启动条件的方式。快速阅读lex/flex manual explains their operation。
<*>
表示在每个州都应用以下模式。这包括一个字符串,由S_STRING
状态表示。要停止在字符串内操作的注释模式,您需要从S_STRING
排除 <*>
状态。您可以通过列出所有其他适用的状态(在您的示例中枚举为<INITIAL,S_SAMPLE>
)来执行此操作。评论规则随后变为:
<INITIAL,SAMPLE_S>"//".* {
}
<INITIAL,SAMPLE_S>"#".* {
}
就是这样。它现在有效! (我测试过BTW)