2013-08-26 43 views
0

我嘗試了很多,但無法弄清楚錯誤是什麼。 關於此的任何詳細解釋將會非常有幫助。製作可重入語法分析器的錯誤

所以基本上我正在嘗試編寫一個可重入的解析器,這些是我的文件。

Lex1.ll

%{ 
#include "Globals.h" 
#include "yac1.tab.hh" 

    extern "C" 
    { 
     int yylex(void); 
    } 


%} 
alpha [A-Za-z] 
digit [0-9] 
%option case-insensitive 
%option bison-bridge 
%option reentrant 
%option noyywrap 
%% 


"DELETE ALL" return DELALL; 

"INSERT"  return INSERT; 


DELETE  return DELETE; 
FIND   return FIND; 

(\+|\-)?[0-9]+   { return INT; } 

\n    { return ENDL; } 
. ; 
%% 

yac1.yy

%{ 
#include <stdio.h> 
#include "Globals.h" 
%} 
%pure-parser 
%error-verbose 

%{ 

#define YYPARSE_PARAM parm 
#define YYLEX_PARAM ((struct parsed_vals *)parm)->scanner 
#define cast ((struct parsed_vals *) parm) 

void yyerror(struct parsed_vals * parm,const char *s) 
{ 
    fprintf(stderr, "error: %s\n", s); 
} 
extern "C" 
{ 
     int yylex(void); 

     // int yywrap() 
     // { 
     //   return 1; 
     // } 
} 
%} 

%token INSERT DELETE DELALL FIND ENDL 
%union { 
    int ival; 
    float fval; 
    char *sval; 
} 

%token <ival> INT 
%token <fval> FLOAT 
%token <sval> STRING 
%% 

S:T  

T:  INSERT val {cast->cmd=INSERT_CMD;} 
     | DELETE val {cast->cmd=DELETE_CMD;} 

; 

val : INT ENDL {cast->type=INT_TYPE; 
       (cast->data).int_data=$1;} 
     | 
     FLOAT ENDL {cast->type=FLOAT_TYPE; 
      (cast->data).float_data=$1;} 
     | 
     STRING ENDL {cast->type=STRING_TYPE; 
      (cast->data).str_data=$1;}  
; 

%% 

我的主要功能testlex.cc

#include <stdio.h> 
#include "Globals.h" 
#include "lexheader.h" 
#include "yac1.tab.hh" 

int yyparse(void *); 
yyscan_t scanner; 
main() 
{ 

struct parsed_vals foo; 
const char * buffer = "inseRt 4\n"; 
yylex_init(&(foo.scanner)); 
yyset_extra(&foo, foo.scanner); 
YY_BUFFER_STATE bp = yy_scan_string(buffer, foo.scanner); 
yy_switch_to_buffer(bp, foo.scanner); 
int a; 
int ret_val = yyparse(&foo); 
yy_delete_buffer(bp, foo.scanner); 
if(ret_val!=0) printf("False"); 
printf ("hello %d\n",foo.data.int_data); 
printf ("hello %d\n",foo.type); 
yylex_destroy(foo.scanner); 

} 

Globals.h

/* 
* File: Globals.h 
* Author: atghosh 
* 
* Created on 3 August, 2013, 8:39 PM 
*/ 

#ifndef GLOBALS_H 
#define GLOBALS_H 

enum CMD {INSERT_CMD=1, DELETE_CMD, FIND_CMD, DELALL_CMD}; 
enum TYPE {INT_TYPE=5, FLOAT_TYPE, STRING_TYPE}; 

struct parsed_vals{ 
    int cmd; 
    int type; 
    union{  
     int int_data; 
     float float_data; 
     char *str_data; 
    } data; 
    void * scanner; 
}; 
#endif /* GLOBALS_H */ 

的Makefile

parser: lex1.ll yac1.yy testlex.cc 
    bison -d yac1.yy 
    flex --header-file="lexheader.h" lex1.ll 
    g++ -o parser yac1.tab.cc lex.yy.c testlex.cc -lfl 

clean: 
    rm -rf *.o parser lexheader.h lex.yy.c lex.yy.cc parser yac1.tab.cc yac1.tab.hh 

我的錯誤列表

bison -d yac1.yy 
flex --header-file="lexheader.h" lex1.ll 
g++ -o parser yac1.tab.cc lex.yy.c testlex.cc -lfl 
yac1.tab.cc: In function ‘int yyparse(void*)’: 
yac1.tab.cc:1302:16: error: too many arguments to function ‘int yylex()’ 
yac1.yy:20:13: note: declared here 
yac1.tab.cc:1510:24: error: cannot convert ‘const char*’ to ‘parsed_vals*’ for argument ‘1’ to ‘void yyerror(parsed_vals*, const char*)’ 
yac1.tab.cc:1625:35: error: cannot convert ‘const char*’ to ‘parsed_vals*’ for argument ‘1’ to ‘void yyerror(parsed_vals*, const char*)’ 
In file included from testlex.cc:3:0: 
lexheader.h:278:1: error: ‘YYSTYPE’ does not name a type 
lexheader.h:280:18: error: variable or field ‘yyset_lval’ declared void 
lexheader.h:280:18: error: ‘YYSTYPE’ was not declared in this scope 
lexheader.h:280:28: error: ‘yylval_param’ was not declared in this scope 
lexheader.h:280:51: error: expected primary-expression before ‘yyscanner’ 
lexheader.h:328:17: warning: ‘yylex’ initialized and declared ‘extern’ [enabled by default] 
lexheader.h:328:17: error: ‘YYSTYPE’ was not declared in this scope 
lexheader.h:328:27: error: ‘yylval_param’ was not declared in this scope 
lexheader.h:328:50: error: expected primary-expression before ‘yyscanner’ 
lexheader.h:328:59: error: expression list treated as compound expression in initializer [-fpermissive] 
make: *** [parser] Error 1 

我只是無法弄清楚什麼錯誤。

期待詳細的答覆和沒有鏈接。

我已經提到了這些鏈接

http://www.phpcompiler.org/articles/reentrantparser.html

http://plindenbaum.blogspot.in/2009/12/parsing-genetic-code-using-flex-and_14.html

回答

2

這裏有一些問題和相應的修復。

  1. 來自lex1.llyac1.yy抹去yylex原型。你不應該在任何地方自己定義它。

  2. 添加兩個#include的附近yac1.yy開頭:

    #include "yac1.tab.hh" 
    #include "lexheader.h" 
    

    請確保您有他們順序,作爲第一個限定YYSTYPE所使用的第二個。這是flex/bison詞法分析器的一個已知問題。

  3. 確定原型和yyerror的定義在yac1.yy中。它應該是:

    void yyerror(const char *s); 
    

    如果你需要一個額外的參數那裏,從自己的電話給自己的目的,你 不能指望解析器來提供。在這種情況下,請定義您自己的錯誤處理程序 並使用不同的名稱。

畢竟,您的程序使用您的Makefile進行編譯。無論它是否按預期工作,我都不知道。

+0

關於#2的說明:如果您在Bison文件中使用'%code requires'塊,#includes將需要放入_separate_'%code'塊。 – cqcallaw