gpt4 book ai didi

c - Bison、Flex 和使用 parser.y 编译我的编译器错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:03:53 25 4
gpt4 key购买 nike

我在编译我的编译器时遇到错误,我不知道为什么。我正在运行 OS X 10.9.1 和最新的 Xcode。

parser.y:1.1-5: 无效指令: `%code'parser.y:1.7-9: 语法错误,意外的标识符

这是我的parser.y的代码

%code top {

#include "frontend.h"
#include "type.h"
#include "ast.h"
#include "env.h"
#include <glib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>

extern int yylex(void);
extern int yyerror(const char*);

}

%code requires {

#include "type.h"
#include "ast.h"
#include <glib.h>

}

%union {
char* id;
char* str;
int num;
GList* list;
Type* type;
struct exp* exp;
struct decl* decl;
struct stmt *stmt;
struct GList *stmts_list;
};

%type <exp> exp
%type <exp> aexp
%type <exp> bexp
%type <exp> obj_lit
%type <exp> lvalue
%type <exp> fun_call

%type <list> decls
%type <list> var_decls
%type <decl> decl
%type <decl> var_decl
%type <decl> fun_decl
%type <decl> type_decl
%type <type> type


/* Ids could be types or exps. */
%token <id> T_ID
%token <str> T_STR
%token <num> T_NUM

%token T_LT_EQ "<="
%token T_GT_EQ ">="
%token T_EQ "=="
%token T_NOT_EQ "!="

%token T_VAR T_TYPE T_FUNCTION
T_FOR T_TO T_WHILE T_IF T_ELSE T_RETURN
T_NIL T_TRUE T_FALSE
T_INT T_BOOL
T_UNKNOWN

%left '|'
%left '&'
%left "==" "!="
%left '<' '>' "<=" ">="
%left '+' '-'
%left '*' '/' '%'
%left T_UMINUS T_UPLUS '!'

%start program

%%

// ian start

program:
decls {
done_parsing($1);
}

decls:
{ GList* declsList = NULL; $$ = declsList; }
| decls decl {
$$ = g_list_append($1, $2);
}

decl: var_decl {
$$ = $1;
}
| fun_decl {
$$ = $1;
}
| type_decl {
$$ = $1;
}

var_decls:
{ GList* declsList = NULL; $$ = declsList; } | var_decls var_decl {
$$ = g_list_append($1, $2);
}

var_decl:
T_VAR T_ID ':' type ';' {
Symbol varName = symbol_var($2);
$$ = decl_new(varName, $4, NULL, NULL, NULL);
}
| T_VAR T_ID ':' type '=' exp ';' {
Symbol varName = symbol_var($2);
$$ = decl_new(varName, $4, $6, NULL, NULL);
}

type_decl:
T_TYPE T_ID ':' type ';' {
Symbol typeName = symbol_typename($2);
$$ = decl_new(typeName, $4, NULL, NULL, NULL);
}

// ian end

// adam start

param_decl:
T_ID ':' type

param_decls:
param_decl
| param_decls ',' param_decl

field_decl:
T_ID ':' type

field_decls:
field_decl
| field_decls ',' field_decl

type:
T_INT
| T_BOOL
| T_ID
| '[' type ']'
| '{' field_decls '}'

fun_decl:
T_FUNCTION T_ID '(' param_decls ')' ':' type '{' var_decls stmts '}'
| T_FUNCTION T_ID '(' param_decls ')' '{' var_decls stmts '}'
| T_FUNCTION T_ID '(' ')' ':' type '{' var_decls stmts '}'
| T_FUNCTION T_ID '(' ')' '{' var_decls stmts '}'

// adam end

// vv IAN
exp:
aexp {
$$ = $1;
}
| bexp {
$$ = $1;
}
| obj_lit {
$$ = $1;
}
| fun_call {
$$ = $1;
}
| lvalue {
$$ = $1;
}
| '(' exp ')' {
$$ = $2;
}

aexp:
T_NUM {
exp_num_new($1);
}
| '+' exp %prec T_UPLUS {
$$ = exp_binop_new(AST_EXP_MUL, exp_num_new(1), $2);
}
| '-' exp %prec T_UMINUS {
$$ = exp_binop_new(AST_EXP_MUL, exp_num_new(-1), $2);
}
| exp '+' exp {
$$ = exp_binop_new(AST_EXP_PLUS, $1, $3);
}
| exp '-' exp {
$$ = exp_binop_new(AST_EXP_MINUS, $1, $3);
}
| exp '/' exp {
$$ = exp_binop_new(AST_EXP_DIV, $1, $3);
}
| exp '%' exp {
$$ = exp_binop_new(AST_EXP_MOD, $1, $3);
}
| exp '*' exp {
$$ = exp_binop_new(AST_EXP_MUL, $1, $3);
}

bexp:
T_TRUE {
$$ = exp_new(AST_EXP_TRUE);
}
| T_FALSE {
$$ = exp_new(AST_EXP_FALSE);
}
| '!' exp {
$$ = exp_not_new($2);
}
| exp '|' exp {
$$ = exp_binop_new(AST_EXP_OR, $1, $3);
}
| exp '&' exp {
$$ = exp_binop_new(AST_EXP_AND, $1, $3);
}
| exp '<' exp {
$$ = exp_binop_new(AST_EXP_LT, $1, $3);
}
| exp "<=" exp {
$$ = exp_binop_new(AST_EXP_LT_EQ, $1, $3);
}
| exp '>' exp {
$$ = exp_binop_new(AST_EXP_GT, $1, $3);
}
| exp ">=" exp {
$$ = exp_binop_new(AST_EXP_GT_EQ, $1, $3);
}
| exp "==" exp {
$$ = exp_binop_new(AST_EXP_EQ, $1, $3);
}
| exp "!=" exp {
$$ = exp_binop_new(AST_EXP_NOT_EQ, $1, $3);
}

// jon start

obj_lit: array_lit | struct_lit
| T_NIL

array_lit:
'[' exps ']'
| T_STR

exps:
exp
| exps ',' exp

struct_lit:
'{' field_inits '}'

field_init:
T_ID '=' exp

field_inits:
field_init
| field_inits ',' field_init

fun_call:
T_ID '(' exps ')'
| T_ID '(' ')'

lvalue:
T_ID
| struct_exp '.' T_ID
| array_exp '[' exp ']'

array_exp: array_lit | fun_call | lvalue
struct_exp: struct_lit | fun_call | lvalue

// jon end

// patrick start

stmts: { GList *stmts_list = NULL; stmts_list = $$; }
| stmts stmt { $$ = g_list_append($1, $2); }

stmt:
exp ';' { $$ = stmt_exp_new($2); }
| lvalue '=' exp ';' { $$ = stmt_assign_new($1 , $3); }
| T_IF '(' exp ')' block T_ELSE block { $$ = stmt_if_new($3, $5, $7); }
| T_IF '(' exp ')' block { $$ = stmt_if_new($3, $5, NULL); }
| T_WHILE '(' exp ')' block { $$ = stmt_while_new($3, $5); }
| T_FOR '(' lvalue '=' exp T_TO exp ')' block { $$ = stmt_for_new($3, $5, $7, $9); }
| T_RETURN '(' exp ')' ';' { $$ = stmt_return_new($3); }
| T_RETURN ';' { $$ = stmt_return_new(NULL); }

block:
'{' stmts '}' { $$ = $2; }

//patrick end

%%

int yyerror(const char *p) {
fprintf(stderr, "Error: %s\n", p);
return 0;
}

最佳答案

从评论来看,您使用的 bison 版本似乎不支持 %code 指令。我相信该指令的初始形式直到 2.3b 版本才进入 Bison ,并且在 2007 年的某个时候引入了合格版本 (%code top)。(这是通过仔细阅读更改日志,不是代码历史。)

如果是这样,您有两个选择:

  1. 只需使用 %{...%}。我在您的源文件中没有看到任何明显的原因,为什么您首先需要 %code top 。 (或者为什么您觉得需要两次#include 您自己的一些 header 。)

  2. 下载并编译与您正在阅读的手册更接近的 bison 版本。

当然,这些并不是相互不兼容的。

关于c - Bison、Flex 和使用 parser.y 编译我的编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23070505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com