c - 弹性 "Unrecognized Error"

标签 c regex flex-lexer

在用 Flex 编写 token 生成器时,我遇到了这个恼人的错误: “无法识别的规则”

我的代码是:

/* Keywords */

TYPE        int|double|bool|char
LOGICAL     if|else|for|foreach|do|while|switch|return
MACROWORD   import|define|ifndef|endif|elseif|udef
MACRO       "#"{MACROWORD}

KEYWORD     {TYPE}|{LOGICAL}|{MACRO}

/* Literals */

DIGIT       [0-9]
DIGITS      {DIGIT}+
OPT_FRAC    ("."{DIGITS})?
OPT_EXP     (E(+|-){DIGITS})?

NUMBER      {DIGITS}{OPT_FRAC}{OPT_EXP}

LETTER      [a-zA-Z]

/* Identifier */

ID          {LETTER}({LETTER}|{DIGIT})*

/* Operators */

OPERATOR    "+"|"-"|"*"|"/"|"^"|"=""="|"<""="|">""="|">"|"<"|"!""=""

%%

{KEYWORD}   printf("(Keyword, %s)\n", yytext);

{NUMBER}    printf("(Numeric Literal, %s)", yytext);

{ID}    printf("(Identifier, %s)", yytext);

{OPERATOR}  printf("(Operator, %s", yytext);

[ \n\t]     /* Ignore Whitespace */

"{"         printf("(L Bracket, %s)", yytext);

"}"         printf("(R Bracket, %s)", yytext);

"("         printf("(L Parens, %s)", yytext);

")"         printf("(R Parens, %s", yytext);

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

%%

main()
{
    yylex();
}

遗憾的是,这只会导致:

“Scanner.lex:39:无法识别的规则”重复19次,后跟一个实例:

“Scanner.lex:43:无法识别的规则”

第 39 行是:

{NUMBER}    printf("(Numeric Literal, %s)", yytext);

第 43 行是:

{OPERATOR}  printf("(Operator, %s", yytext);

我在互联网上搜索并发现this answer also on stackoverflow其中建议在定义行的开头添加“^”,因此我将第 39 行引用(编号)更改为:

NUMBER    ^{DIGITS}{OPT_FRAC}{OPT_EXP}

什么也没做。 有什么建议吗?

最佳答案

这太可怕了,因为 OPT_EXP 中的 + 没有任何 + 内容。 (这是一个 RE +,而不是文字加号。)

您的 OPERATOR 定义有太多双引号。

关于c - 弹性 "Unrecognized Error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16129107/

相关文章:

c - 为什么从返回 int32_t 的函数返回 0x80000000 不会导致警告?

c - 同一信号的多个信号处理程序,例如西格勒姆

c - 在 C 中要求用户重复该程序或退出

c - Flex - 在 C 中比较字符串的函数

macos - 在Mac OS X 10.6上编译和执行莎士比亚编程语言转换器spl2c会导致警告/错误

javascript - 使用 AJAX 下载文件。从 SD 卡。

python - 如何使用 re 替换和移动 python 中的字符串模式?

javascript - 如何验证在特定条件下必须存在的字符

javascript - 正则表达式只匹配逗号但不匹配多个括号

parsing - 如何消除 flex & bison 的 'main' 例程,以便我可以将词法分析和解析过程放入库中?