'='标记之前的预期表达式

Ali*_*tan 2 c yacc lex bison

我想做解析器,它将把表达式输出到它们的计算步骤中。而且,当我编译代码时,我无法解决这些问题。我总是会出错

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)

ric*_*ici 6

lex规则中的操作必须与模式在同一行上开始。所以你需要写,例如

[a-zA-Z]+  {
    yylval.name = strdup(yytext);
    return(ID);
    }
Run Code Online (Sandbox Code Playgroud)

就其价值而言,该要求已在flex手册中的输入文件格式中明确说明:

flex输入的rules部分包含一系列形式的规则:

pattern   action
Run Code Online (Sandbox Code Playgroud)

模式必须不缩进,并且动作必须在同一行上开始。

据我所知,此限制在所有lex实现中都存在,尽管后果不同。之所以引用Flex手册,是因为我发现它比Posix描述更具可读性,并且它还描述了许多仅适用于Flex的有用功能。