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
.
どうしたの?