Bison flex新系列未被认可

时间:2013-05-27 21:14:51

标签: syntax syntax-error newline bison flex-lexer

这是我的输入文件:

class Box{ 
integer x;
}

parses识别令牌CLASS,IDENTIFIER,{然后它说下一个令牌是$ undefined 然后它打印语法错误

当代码在一行中时:

class Box{integer x;}

它按预期工作......

所以主要问题是如何识别新行

编辑:这是flex文件的一部分

declarations
%%
"\n" {return (NEWLINE);  }
[ ]+ /* blank, tab, new line: eat up whitespace */  
. {return(yytext[0]);}
%%
Auxiliary functions

我是否需要将空白,制表符和新行代码更改为:?

[ \t\n]+         /* blank, tab, new line: eat up whitespace */
.                    {return(yytext[0]);}

edit2:我的flex文件是:

flex
%{
#include "arxeio.tab.h"
%}
KEF [A-Z]
MIK [a-z]
NUM [0-9]
US [_]
ID [A-Z]([A-Z]*[a-z]*[0-9]*[_]*)*|[a-z]([A-Z]*[a-z]*[0-9]*[_]*)*|[_]([A-Z]*[a-z]*[0-9]*[_]*)*
AR [0-9]+
%%
":="  {return (ASSGNOP); }
char {return (CHAR);  }
else { return (ELSE);  }
if {return (IF);  }
integer {return (INTEGER); }
class {return (CLASS); }
new {return (NEW);  }
return {return (RETURN); }
void {return (VOID);  }
while {return (WHILE); }
{ID} {return(IDENTIFIER) ;}
{AR} {return (NUMBER); }
"\n"   { fputs("<<newline>>\n", stderr); return (NEWLINE); }
"\""  {return (ET);  }
"\'"  {return (ET);  }
"\0"  {return (ET);  }
"\t"  {return (ET);  }
"\\"  {return (ET);  }
[ \t\n]+ /* ignore spaces, tabulations,line breaks,blank, tab, new line: eat up whitespace*/
.                    {return(yytext[0]);}
%%

我的野牛档案是:

  %{
    #include  <stdio.h>
    #include  <stdlib.h>
    #include  <string.h>
    #include   <math.h>
    #define YYDEBUG 1
    int yylex(void) ;
    extern FILE *yyout;
    int errors;
    %}
    %start program
    %token CHAR ELSE IF INTEGER CLASS NEW RETURN VOID WHILE ASSGNOP
    %token NUMBER NEWLINE
    %token IDENTIFIER
    %token KEF MIK NUM ET 
    %left  '`''~''@''#''$''^''['']''{''}'',''_''?''.'';'':'
    %left '|''&''!'
    %left '>''<''='
    %left '-''+'
    %left '*''/''%'
    %left '('')'
    %expect 32
    %%
    ...
    ...
    ...
    program : CLASS IDENTIFIER '{'NEWLINE declar'}' 
    ;

    %%

    main (int argc,char *argv[])
    {extern FILE *yyin;
    ++argv;--argc;
    yyin = fopen ( argv[0],"r");
    yydebug = 1;
    errors = 0;
    yyparse();
    }

    yyerror(char *errmsg)
    {
    fprintf(stderr, "%s\n",errmsg);
    }

2 个答案:

答案 0 :(得分:0)

假设Flex代码是'copy'n'pasted,你有一个简单的拼写错误:

"/n" {return (NEWLINE);  }

应该是:

"\n" { return(NEWLINE); }

您可以通过使用(暂时)来帮助自己调试:

"\n" { fputs("<<newline>>\n", stderr); return (NEWLINE); }

然后观察它永远不会被执行。

答案 1 :(得分:0)

由于您有此规则:"/n" {return (NEWLINE); },您显然需要在语法中指定NEWLINE{之后;我想你没有,哪个是可以理解的。

因此,您需要使用这些规则

[ \t\n]+ /* ignore spaces, tabulations and line breaks */
.        {return(yytext[0]);}