2014-03-30 17 views
0

我想用Lex在双引号内打印文本。Lex用C编码

["]?([A-Z]*[a-z]*[0-9]*)*["]? { 
printf("STR(%s),yytext"); 
return 1; 
} 

我用这个但蹊跷的是,我不能弄明白。

实施例:

输入

"CNG230 ASN1 Average" 

输出

STR("CNG230 ASN1 Average") 

实施例2:

输入

"CNG230/492 Global average" 

输出

STR("CNG230/492 Global average") 

回答

1

其实你不说有什么问题或者你的例子,我假设

printf("STR(%s),yytext"); 

仅仅是

printf("STR(%s)",yytext); 

一个错字,但这里有两个问题,我可以看到。

  1. 如果你指定你的问题正确,你不在乎,只要它是不是又报价引号内是什么。所以你的规则减少到

    \"[^"]*\" { ... } 
    
  2. 如果没有规则匹配的缺省动作是回显输入。因此,您需要另一个规则来消耗不符合此规则的所有内容。将这样算账:

    .|\n {} 
    
0

您的主要问题似乎是您的模式不允许空间为有效字符。你也不需要与您匹配的这么复杂:

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

请注意,我还与打印值提供printf(),并输出一个换行符在最后,所以你会看到的信息及时。

+0

这是一个很好的形式给出感谢那可是appyling这个代码,我得到了错误,说行号和规则不能匹配后也没有包含像/字符的另一个例子。所以,你可以说下面的部分是可以的,但需要了解如何创建[“]?[A-Za-z0-9] * [”]?以正确的方式?谢谢。 – Xethen

+1

我无法调试你没有显示的东西。单独采用(以'%%'为前缀,后跟'%%'),该片段可以编译为一个独立的程序,当我在其中键入''abc def''时,它会以'STR (“abc def”)。所有符合你问的事。没有看到更多的扫描仪,没有人可以告诉你其他代码有什么问题。 –

+0

我设法做到了,但它像STR(“C”STR(N))...我怎么可能在STR(“CNG230 ASN1 Average”)格式中做? – Xethen