Lex和Yacc发表评论

时间:2013-12-11 23:48:57

标签: lex

我正在尝试找出问题的根本原因。我有以下需要解析的行 -

sample format "string";

需要对sampleformat进行标记,并且需要将提取的逗号中的任何内容提供给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;"时,它可以正常工作,但是当我在字符串中添加注释字符#时,它会失败。你能帮忙解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

答案取决于您使用默认 启动条件的方式。快速阅读lex/flex manual explains their operation

<*>表示在每个州都应用以下模式。这包括一个字符串,由S_STRING状态表示。要停止在字符串内操作的注释模式,您需要S_STRING 排除 <*>状态。您可以通过列出所有其他适用的状态(在您的示例中枚举为<INITIAL,S_SAMPLE>)来执行此操作。评论规则随后变为:

<INITIAL,SAMPLE_S>"//".* {
}

<INITIAL,SAMPLE_S>"#".* {
} 

就是这样。它现在有效! (我测试过BTW)