我想做解析器,它将把表达式输出到它们的计算步骤中。而且,当我编译代码时,我无法解决这些问题。我总是会出错
code.l:13:1: error: expected expression before '=' token
yylval.name = strdup(yytext);
^
code.l:18:1: error: expected expression before '=' token
yylval.name = strdup(yytext);
^
Run Code Online (Sandbox Code Playgroud)
我尝试了很多不同的事情,我认为这是一个问题,但是没有成功。
代码
code.l:13:1: error: expected expression before '=' token
yylval.name = strdup(yytext);
^
code.l:18:1: error: expected expression before '=' token
yylval.name = strdup(yytext);
^
Run Code Online (Sandbox Code Playgroud)
代码
%{
#include <stdio.h>
#include <string.h>
#include "Assignment.tab.h"
%}
%%
" " ;
"\t" ;
[a-zA-Z]+
{
yylval.name = strdup(yytext);
return(ID);
}
[0-9]+
{
yylval.name = strdup(yytext);
return(NUM);
}
[-+=()*/\n]
{
return yytext[0];
}
.
{
yyerror("unknown character");
}
%%
Run Code Online (Sandbox Code Playgroud)
我不需要最终项目的解决方案,只需要查找导致错误的原因。任何想法都是有帮助的。
编辑:Assignment.tab.h文件
%{
#include<stdio.h>
int temp = 0;
%}
%start list
%union
{
char *name;
}
%token <name> ID
%token <name> NUM
%type <name> list stat expr
%left '+' '-'
%left '*' '/'
%left UMINUS
%%
list:
|
list stat '\n'
|
list error '\n'
{
yyerrok;
}
;
stat:
expr
{
printf("stat:t = (%s)\n:stat",$1);
}
|
ID '=' expr
{
printf("stat:(%s) = (%s):stat", $1, $3);
}
;
expr:
'(' expr ')'
{
$$ = $2;
}
|
expr '*' expr
{
printf("t = (%s) * (%s)", $1, $3);
$$ = "t";
}
|
expr '/' expr
{
printf("t = (%s) / (%s)", $1, $3);
$$ = "t";
}
|
expr '+' expr
{
printf("t = (%s) + (%s)", $1, $3);
$$ = "t";
}
|
expr '-' expr
{
printf("t = (%s) - (%s)", $1, $3);
$$ = "t";
}
|
'-' expr %prec UMINUS
{
printf("t = -(%s)", $2);
$$ = "t";
}
|
ID
{
$$ = $1;
}
|
NUM
{
$$ = $1;
}
;
%%
main()
{
return(yyparse());
}
yyerror(s)
char *s;
{
fprintf(stderr, "%s\n",s);
}
yywrap()
{
return(1);
}
Run Code Online (Sandbox Code Playgroud)
lex规则中的操作必须与模式在同一行上开始。所以你需要写,例如
[a-zA-Z]+ {
yylval.name = strdup(yytext);
return(ID);
}
Run Code Online (Sandbox Code Playgroud)
就其价值而言,该要求已在flex手册中的输入文件格式中明确说明:
flex输入的rules部分包含一系列形式的规则:
Run Code Online (Sandbox Code Playgroud)pattern action模式必须不缩进,并且动作必须在同一行上开始。
据我所知,此限制在所有lex实现中都存在,尽管后果不同。之所以引用Flex手册,是因为我发现它比Posix描述更具可读性,并且它还描述了许多仅适用于Flex的有用功能。