用C语言进行Lex编码

用C语言进行Lex编码,c,text,lex,C,Text,Lex,我想使用Lex获取并打印双引号内的文本 ["]?([A-Z]*[a-z]*[0-9]*)*["]? { printf("STR(%s ),yytext"); return 1; } 我用过这个,但有点不对劲,我想不出来 例如: 输入 输出 STR("CNG230 ASN1 Average") STR("CNG230/492 Global average") 例2: 输入 输出 STR("CNG230 ASN1 Average") STR("CNG230/492 Global aver

我想使用Lex获取并打印双引号内的文本

["]?([A-Z]*[a-z]*[0-9]*)*["]? {
printf("STR(%s ),yytext");
return 1;
}
我用过这个,但有点不对劲,我想不出来

例如:

输入

输出

STR("CNG230 ASN1 Average")
 STR("CNG230/492 Global average")
例2:

输入

输出

STR("CNG230 ASN1 Average")
 STR("CNG230/492 Global average")

您的主要问题似乎是您的模式不允许将空格作为有效字符。您也不需要对匹配非常复杂:

["]?[A-Za-z0-9 ]*["]? {
    printf("STR(%s)\n", yytext);
    return 1;
}

请注意,我还为
printf()
提供了一个要打印的值,并在末尾输出了一个换行符,以便您能够及时看到信息。

您实际上并没有说您的示例有什么问题,我假设

printf("STR(%s ),yytext");
只是一个拼写错误

printf("STR(%s )",yytext);
但我可以看到两个问题

  • 如果您正确地指定了您的问题,那么您不在乎引号内的内容,只要它不是另一个引号。所以你的规则变成了

    \"[^"]*\" { ... }
    
  • 如果没有规则匹配,默认操作是回显输入。因此,您需要另一个规则来使用与此规则不匹配的所有内容。然后放置此文件:

    .|\n {}
    

  • 这是一个很好的解释,谢谢,但是在应用了这段代码之后,我得到了一个错误,它说行号和规则不能匹配,还有另一个例子,它包含像/。那么,关于以下部分可以,但需要了解如何创建[“]?[A-Za-z0-9]*[“]?以正确的方式?谢谢。我不可能调试你没有显示的内容。该片段本身(前缀为
    %%
    ,后跟
    %%
    ),可以编译成一个独立的程序,当我在其上键入
    “abc def”
    时,它会以
    STR(“abc def”)
    响应。所有这些都符合你的要求。在看不到更多扫描仪的情况下,没有人能告诉你其余的代码有什么问题。我成功地做到了这一点,但它就像STR(“C)STR(N)…我怎么可能用STR(“CNG230 ASN1 Average”)格式呢?