1

私はパーサーを構築していますが、それらを解決できなかったいくつかのエラーがあります。私はバイソンとフレックスに夢中です。それらを解決するのを手伝って、なぜここでそれらが起こっているのかを理解してください。

   lexical.l:3:20: error: common.h: No such file or directory
In file included from lexical.l:5:
bison.tab.h:81: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before âyylvalâ
bison.tab.c:1155: error: conflicting types for âyylvalâ
bison.tab.h:81: note: previous declaration of âyylvalâ was here
bison.y: In function âyyparseâ:
bison.y:96: error: incompatible types when assigning to type âSTYPEâ from type âNODEPTRâ

これが私のパーサーファイルbison.yです。

%{
#include <stdio.h>
#include "bison.tab.h"
#include "common.h"
//int yylex();
void yyerror (char const *);

typedef struct STYPE {
    NODEPTR pointer;
} STYPE;

#define YYSTYPE STYPE

%}



/* Bison declarations. */

%token ELSE REAL INTEGER XWRITE WHILE END DO IF THEN XPROGRAM FUNCTION XRETURN XREAD VAR FOR XBEGIN CALL ID NUM  
%token RELOP ADDOP MULOP ASSIGN AND OR NOT  
%left '-' '+'
%left '*' '/'
%nonassoc LOWER_THAN_ELSE
%nonassoc ELSE
4

2 に答える 2

2

bison ファイルを使用している場合は、flex ファイルも#define YYSTYPE使用する必要があります#define YYSTYPE。これは、bison が生成されたヘッダー ファイルに #define を配置しないためです。生成されたヘッダー ファイルを #include する前に、これを行う必要があります。

Bison は生成されたヘッダーに #define を入れません。これは、インクルード ファイルで #define を行う可能性があるため、行ったかどうかを知る方法がないためです。#define YYSTYPE実際、もしあなたが#include.

また、生成されたコードを再生成するときは、flex プログラムは生成されたヘッダー ファイルに依存するため、常に bison プログラムを最初に生成することを忘れないでください。それはあなたがやっている方法とは逆の順序です。

このすべてをもう少し明確にするために、ここに例を示します。

 common.h:

   struct MyType {
     /* ... /
   };

   #define YYSTYPE struct MyType;


 lexer.l:

   %{
      /* All your standard includes go here */
      /* Must go in this order */
      #include "common.h"
      #include "bison.tab.h"

   %}

 bison.y:

   %{
      /* Whatever library includes you need */
      #include "common.h"
      /* Don't include bison.tab.h; it will get inserted automatically */
   %}
于 2012-12-11T17:26:54.080 に答える
1

yytext エラーを修正するには、これを bison.y に追加します:-

extern char *yytext

yyerror エラーを修正するには、bison.y の上部にあるプロトタイプを以下の定義と一致させます:-

int yyerror(const char *message);

yylval エラーを修正するにはもう少し作業が必要ですが、私はこれを十分に理解していません。シンプルな hello,world タイプのレクサー、パーサーを試して、そこから先に進むことをお勧めします。

これが私が使用したcommon.hです:-

typedef struct STYPE {
    int pointer;
} STYPE;

そしてlexerのヘッダー:-

%{
#include "common.h"
#define YYSTYPE STYPE
#include <stdio.h>
#include"bison.tab.h"
void showToken(char*);
%}

そしてパーサーのヘッダー:-

%{
#include <stdio.h>
#include "common.h"
extern char *yytext;
#define YYSTYPE STYPE
%}

これにより、1 つのエラーといくつかの警告が表示されますが、これらは未定義の関数によるものです。STYPE の宣言をレクサーとパーサーの先頭に移動したことに注意してください。

于 2012-12-11T11:21:04.920 に答える