C Flex 代码调试

标签 c flex-lexer

下面的代码是C语言的词法识别器:

    %{
#include <stdio.h>
void showToken(char*);
%}

%option yylineno
%option noyywrap
digit ([0-9])
letter ([a-zA-Z])
%%

letter(letter | digit)*             showToken("id");
(digit)(digit)*(.(digit)(digit)*)?      showToken("num");
[(),:;.]                printf("%c",yytext[0]); 
[ \n]
(==|<>|<|<=|>|>=)       showToken("relop");
(+|-)                   showToken("addop");
(*|/)                   showToken("mulop");
(=)                 showToken("assign");
(&&)                    showToken("and");
(||)                    showToken("or");
(!)                 showToken("not");
.                   {   
                    printf("Lexical Error");
                    exit(0);
                    }

%%
void showToken(char* name){
    printf("<%s,%s>",name,yytext);
}
%%

我收到以下错误,为什么会发生这种情况我认为我编写的代码是正确的! 我对代码做了太多更改,但它无法编译。

~/hedor>lex -t lexical.l > lexical.c
lexical.l:13: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:21: unrecognized rule
lexical.l:21: unrecognized rule
lexical.l:21: unrecognized rule
lexical.l:21: unrecognized rule

最佳答案

您的正则表达式存在几个问题:

第13行,实际上错误在第12行,不要在RE中添加空格,它会破坏表达式并且无法按预期工作:

letter(letter|digit)*             showToken("id");

第17行,+是一个特殊字符,所以用\转义:

(\+|-)                   showToken("addop");

第18行,与字符*/相同:

(\*|\/)                   showToken("mulop");

第21行,与|相同:

(\|\|)                    showToken("or");

这应该可以修复编译错误,但请注意下面 @JameySharp 的评论,您可能希望使用大括号编写 digitletter 引用: {数字}{字母}

关于C Flex 代码调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13311724/

相关文章:

c - 语法错误,意外的 TRUE,期望 '{'

c - lex 程序错误

c - 在 C 中的两个文件之间共享动态填充的数组

c - 当在条件操作中使用移位操作时,while 循环变为无限

c - memmove 与复制单个数组元素

c - 如何声明函数原型(prototype)及其参数声明列表?

c++ - 弹性代币订单

使用 flex 编译多个词法分析器会导致重新定义错误

c - OpenMP 段错误

c - 如何使用 flex/bison 解析 C 字符串 (char *)?