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]+
移到顶部,然后重试?同时从语法中删除换行符
。