【问题标题】:"Unrecognized rule" error in lex programlex 程序中的“无法识别的规则”错误
【发布时间】:2026-01-18 04:55:02
【问题描述】:

我正在编写一个 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 ();
}

还有输出:

【问题讨论】:

  • Flex 可能不理解您输入文件的字符编码。据我所知,Flex 仍然只能理解单字节字符。
  • 扩大 Thomas 的评论:尝试一个更简单的程序版本,将 carac 定义为 carac (:|;|.|,|/|?|=|-|!|^|%)
  • @DavidGorsline 仍然无法解决某些问题
  • 您可能需要引用特殊字符:carac (\:|\;|\.|\,|\/|\?|\=|\-|\!|\^|\% ) 或者使用字符类表示法:carac [-:;.,/?=!^%]

标签: lex flex-lexer


【解决方案1】:

(答案包含在 cmets 中,我将其包括在此处。请参阅 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 运行它。以下不会给出 flex 错误:

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

【讨论】: