Bison 这个简单的Lex示例有什么问题?

Bison 这个简单的Lex示例有什么问题?,bison,lex,Bison,Lex,大家好, 我用lex语言编写了一个简单的代码,我试着用“bison-d hello.l”运行它,但我发现了一个错误! 我得到以下错误 有人能告诉我我错了什么吗 bison -d hello.l hello.l:4.1-5: syntax error, unexpected identifier 代码: %{ #包括 %} 数字[0-9] ID[a-z][a-z0-9]* %% {数字}+{ printf(“一个整数:%s(%d)\n”),yytext, 原子能机构(文本); } {DIGIT

大家好, 我用lex语言编写了一个简单的代码,我试着用“bison-d hello.l”运行它,但我发现了一个错误! 我得到以下错误

有人能告诉我我错了什么吗

bison -d hello.l

hello.l:4.1-5: syntax error, unexpected identifier
代码:

%{
#包括
%}
数字[0-9]
ID[a-z][a-z0-9]*
%%
{数字}+{
printf(“一个整数:%s(%d)\n”),yytext,
原子能机构(文本);
}
{DIGIT}+“{DIGIT}*{
printf(“浮点数:%s(%g)\n”),yytext,
atof(yytext));
}
如果|那么|开始|结束|过程|函数{
printf(“关键字:%s\n”,yytext);
}
{ID}printf(“标识符:%s\n”,yytext);
“+”|“-“|”*“|”/”printf(“运算符:%s\n”,yytext);
“{”[\^{}}\n]*“}”/*吃光一行注释*/
[\t\n]+/*吃光空白*/
.           printf(“无法识别的字符:%s\n”,yytext);
%%
int main(int argc,字符**argv)
{
++argv,--argc;/*跳过程序名*/
如果(argc>0)
yyin=fopen(argv[0],“r”);
其他的
yyin=stdin;
yylex();
}

您正试图用bison编译(f)lex输入文件。使用yylex或flex

编辑:好的,进一步的问题(我试图编译你的代码):

  • 规则必须从行的开头开始,不带任何字符 前面的空白(删除开头的空白 第9行、第14行等)

  • 在文件开头添加
    %选项noyywrap

  • 使用
    flex filename.l
    编译文件

  • 然后编译生成的.c文件。您不需要额外的标题


  • 我使用bison生成CONST.H文件!因为当我想编译lex.yy.c文件时,我会遇到一些错误,比如“未声明(首次在此函数中使用)”!当我在网上搜索时,我知道我需要一个Const.h文件,所以我想生成那个文件。如何做到这一点?如果知道哪些是未声明的,那将非常有帮助。9 C:\Users\Majid\Desktop\F\hello.l`DIGIT'未声明(首次使用此函数)我发现这篇文章和我的文章一样。请帮助我如何生成包含windows中定义的“y.tab.h”?我想您发布的示例就是flex手册中的示例。我仍然不明白你到底做了什么,哪个命令给出了哪个错误。如果不使用bison,则不需要y.tab.h文件。
    %{
    #include <math.h>
    %}
    DIGIT    [0-9]
    ID       [a-z][a-z0-9]*
    
    %%
    
         {DIGIT}+    {
                     printf( "An integer: %s (%d)\n", yytext,
                             atoi( yytext ) );
                     }
    
         {DIGIT}+"."{DIGIT}*        {
                     printf( "A float: %s (%g)\n", yytext,
                             atof( yytext ) );
                     }
    
         if|then|begin|end|procedure|function        {
                     printf( "A keyword: %s\n", yytext );
                     }
    
         {ID}        printf( "An identifier: %s\n", yytext );
    
         "+"|"-"|"*"|"/"   printf( "An operator: %s\n", yytext );
    
         "{"[\^{}}\n]*"}"     /* eat up one-line comments */
    
         [ \t\n]+          /* eat up whitespace */
    
         .           printf( "Unrecognized character: %s\n", yytext );
    
         %%
    
         int main( int argc, char **argv )
             {
             ++argv, --argc;  /* skip over program name */
             if ( argc > 0 )
                     yyin = fopen( argv[0], "r" );
             else
                     yyin = stdin;
    
             yylex();
             }