lex程序中的“无法识别的规则”错误

时间:2013-04-09 23:22:25

标签: lex flex-lexer

我正在写一个lex程序。这个问题的目的是输入一个字符串(字母和其他字符),然后返回该字符串的长度。

以下是代码:

letter ([a-z]|[A-Z])
carac (•|¤|¶|§|à|î|ì|Ä|Å|É|æ|Æ|ô|ö|ò|û|ù|ÿ|Ö|Ü|ø|£|Ø|×|ƒ|á|í|ó|ú|ñ|Ñ|ª|º|¿|®|¬|½|¼|¡|:|;|.|,|/|?|=|-|!|*|£|µ|^|¨|%)
String {letter}({letter}|{carac})*
%%
{String} printf("[%d] : The number of your String \n",yyleng);
.* printf("You have a problem somewhere !"); 
%%
int yywrap(){return 1;}
main ()
{
    yylex ();
}

输出:

enter image description here

1 个答案:

答案 0 :(得分:0)

(答案包含在评论中,我在此处提及。请参阅Question with no answers, but issue solved in the comments (or extended in chat))。

@Thomas Padron-McCarthy和@David Gorsline是正确的:

  • Flex可能不了解输入文件的字符编码。据我所知,Flex仍然只能理解单字节字符。

  • 放大Thomas的评论:尝试更简单的程序版本,将carac定义为carac (:|;|.|,|/|?|=|-|!|^|%)

  • 您可能需要引用特殊字符:carac (\:|\;|\.|\,|\/|\?|\=|\-|\!|\^|\%)或使用字符类表示法:carac [-:;.,/?=!^%]

为了确认这一点,我应用了这些编辑并通过flex运行它。以下不会给出弹性错误:

carac (\•|\¤|\¶|\§|\à|\î|\ì|\Ä|\Å|\É|\æ|\Æ|\ô|\ö|\ò|\û|\ù|\ÿ|\Ö|\Ü|\ø|\£|\Ø|\×|\ƒ|\á|\í|\ó|\ú|\ñ|\Ñ|\ª|\º|\¿|\®|\¬|\½|\¼|\¡|\:|\;|\.|\,|\/|\?|\=|\-|\!|\*|\£|\µ|\^|\¨|\%)