1

Bison 3.0 (C パーサー ジェネレーター)、Flex 2.5.35、および gcc 4.4.7 を使用して、CentOS 6.0 で言語パーサーを開発しようとしています。次の Bison 文法ファイルがあります。

%{
#include <stdio.h>
%}

%union {
  int int_t;
  char* str_t;
}
%token SEP
%token <str_t> ID
%start start
%type <int_t> plst

%%

start: plst start
     | EOS              { YYACCEPT; }
;
// <id> , <id> , ... , <id>
plst: ID SEP_PARAMS plst    { printf("Rule 1 %s %s \n",$1,$2); } 
    | ID            { printf("Rule 2 %s \n", $1); }
    | /* empty */       {  }
;

%%

int yyerror(GNode* root, const char* s) {printf("Error: %s", s);}

問題

今のままでは、あまり意味のあるものではありませんが、私の問題を理解するには十分だと思います。私のトークンを認識する Flex で書かれたスキャナーがあるとします。この文法ファイルは、次のような単純な識別子リストを認識するために使用されますid1,id2,...,idn。私の問題は、各文法規則で、識別子の値 (識別子と同じものを表す文字列) を取得しようとすると、 sNULLによっても証明されるようにポインターを取得することです。printf

私は何を間違っていますか?ありがとうございました

編集

最近の回答のおかげで、問題が Flex とその構成ファイルに強く関連していることを理解できました。特に、 Flex Manual for Bison Bridging で説明されている仕様を満たすために、lex ファイルを編集しました。

{ID}     { printf("[id-token]");
           yylval->str_t = strdup(yytext);
           return ID; }

ただし、Bison、Flex (--bison-bridgeオプションを提供)、コンパイラの順に実行した後、生成されたパーサーを実行すると、すぐにSegmentation Fault.

どうしたの?

4

2 に答える 2

2

flex オプション--bison-bridge(または%option bison-bridge) は、 bison オプションまで一致します%define api.pure。BOTH または NEITHER のいずれかを使用する必要がありますbison-bridgeapi.pureどちらの方法でも機能しますが、一貫性が必要です。を使用していないようですのでapi.pure、オプションを削除したいと考えてい--bison-bridgeます。

于 2013-10-13T19:37:32.670 に答える
0

などの値は$1$2レクサーによって設定する必要があります。

次のような識別子のレクサーにルールがある場合

ID       [a-z][a-z0-9]*

%%

{ID}    { return ID; }

セマンティック値は設定されていません。

あなたがしなければならない例えば

{ID}    {   /* Set the unions value, used by e.g. `$1` in the parser */
            yylval.str_t = strdup(yytext); 
            return ID;
        }

がメモリfreeを割り当てるので、パーサーの値を覚えておいてください。strdup

于 2013-10-13T17:56:47.393 に答える