Syntax 未识别Bison flex新品

Syntax 未识别Bison flex新品,syntax,syntax-error,newline,bison,flex-lexer,Syntax,Syntax Error,Newline,Bison,Flex Lexer,这是我的输入文件: class Box{ integer x; } 解析识别令牌类、标识符,{然后说下一个令牌是$undefined,然后打印语法错误 当代码在一行中时,如: class Box{integer x;} 它按预期工作 因此,主要问题是如何识别新线路 编辑:这是flex文件的一部分 declarations %% "\n" {return (NEWLINE); } [ ]+ /* blank, tab, new line: eat up whitespace */ .

这是我的输入文件:

class Box{ 
integer x;
}
解析识别令牌类、标识符,{然后说下一个令牌是$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);
    }
flex
%{
#包括“arxeio.tab.h”
%}
KEF[A-Z]
迈克[a-z]
数值[0-9]
美国
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);}
整数{返回(整数);}
类{返回(类);}
新{返回(新);}
return{return(return);}
void{返回(void);}
while{return(while);}
{ID}{return(标识符);}
{AR}{return(NUMBER);}
“\n”{fputs(“\n”,stderr);返回(换行);}
“\”{return(ET);}
“\'”{return(ET);}
“\0”{返回(ET);}
“\t”{return(ET);}
“\\”{return(ET);}
[\t\n]+/*忽略空格、表格、换行符、空白、制表符、新行:吃掉空白*/
.{return(yytext[0]);}
%%
我的野牛档案是:

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);
    }
%{
#包括
#包括
#包括
#包括
#定义调试1
int yylex(无效);
外部文件*yyout;
整数错误;
%}
%启动程序
%令牌字符ELSE如果整数类NEW在ASSGNOP时返回VOID
%令牌号换行符
%令牌标识符
%令牌KEF MIK NUM ET
%左'''''.''.''.'.''.'.''.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.''.'.'.''.'.'.''.''.''.''.'''.''.''.''.'
%左“|”&”

%左'>''假设Flex代码是复制粘贴的,您有一个简单的打字错误:

"/n" {return (NEWLINE);  }
应该是:

"\n" { return(NEWLINE); }
您可以使用(暂时)帮助自己调试:

“\n”{fputs(“\n”,stderr);返回(换行);}

然后观察它从未被执行。

既然你有这样的规则:
“/n{return(NEWLINE);}
,你显然需要在语法中指定
NEWLINE
跟在
{
后面;我想你没有,这是可以理解的

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

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

通常,词法扫描程序将“跳过”换行符,除了递增输入行计数器外,将它们视为空白。当然,您可能会反对它们出现在字符串或字符常量中,并且它们标记单行注释的结尾,但所有这些都在词法扫描程序中处理。因为您没有对于您的任何Flex代码,我们不能说更多了。@JonathanLeffler我已经更新了问题注释,
“/n”
”\n"
。复制粘贴代码时一定有问题。。代码如您所说,因此没有任何问题。当词汇扫描程序返回换行符时,语法会做什么?换行符是语言中可识别的标记吗?我已将换行符包含在我的标记中-->
%token NEWLINE
包含在语法中,是的,换行符已重新标记ized as token-您能解释一下您的第一个问题吗?当您遇到错误时,Flex analyzer返回什么标记?您已经确保词法分析器中的每个
return
都有一个
printf()
或类似的标记,这样您就可以确切地看到您的分析器在做什么(如我的
fputs()
建议)?返回哪个值?您的语法似乎不认为它是换行符。您是如何定义换行符的?Flex analyzer中是否包含Bison语法的标头?问题仍然存在。我已在上面附加了我的Bison和Flex代码,我第一个拥有此
程序:类标识符'{'declar..
我改为
program:CLASS标识符'{'NEWLINE declar..
在解析器识别
{
它抛出的符号
下一个标记是$undefined
,然后它
停止
是否检测到换行符?如果将
放入
返回(换行符)之前,会发生什么情况
?问题仍然存在。我已在上面附加了bison和flex代码。我看不出问题来自何处。能否删除
“\n”
的词法规则,将
[\t\n]+
移到顶部,然后重试?同时从语法中删除
换行符