0

这是我的输入文件:

class Box{ 
integer x;
}

解析识别令牌 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
%{
#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);
    }
4

2 回答 2

0

假设 Flex 代码是复制粘贴的,你有一个简单的错字:

"/n" {return (NEWLINE);  }

应该:

"\n" { return(NEWLINE); }

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

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

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

于 2013-05-27T22:02:48.793 回答
0

既然你有这个规则: ,你显然需要在你的语法"/n" {return (NEWLINE); }中指定NEWLINE以下内容;{我猜你没有,这是可以理解的。

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

[ \t\n]+ /* ignore spaces, tabulations and line breaks */
.        {return(yytext[0]);}
于 2013-05-28T10:31:08.160 回答