这是我的输入文件:
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);
}
答案 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]);}