2011-07-05 3 views
3

私はbisonで書かれたパーサにトークンを渡すflexで書かれた字句解析器を持っています。

次は私のレクサーのごく一部です:

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

%% 

rule { 
    printf("A rule: %s\n", yytext); 
    return RULE; 
} 

{ID} { 
    printf("An identifier: %s\n", yytext); 
    return ID; 
} 

"(" return LEFT; 
")" return RIGHT; 

あまりにも空白などを解析するための他のビットがあります。

はその後、パーサの一部は次のようになります。

%{ 
#include <stdio.h> 
#include <stdlib.h> 
#define YYSTYPE char* 
%} 

%token ID RULE 
%token LEFT RIGHT 

%% 

rule_decl : 
    RULE LEFT ID RIGHT { printf("Parsing a rule, its identifier is: %s\n", $2); } 
    ; 

%% 

これは、すべての作業罰金だが、私はただのprintfを使用してIDトークンをプリントアウトしたい - それは:)すべてです。私はコンパイラを書いているわけではありません。flex/bisonは私のソフトウェアのための良いツールです。あなたはどのようにトークンを印刷するのですか?印刷するとちょうど(null)になります。

ありがとうございます。

+3

'$ 2'はそのルールの' LEFT'トークンでしょうか? '$ 3'はあなたが印刷したい' ID'トークンではないでしょうか? –

+0

$$はルール、$ 1は左、$ 2はID、$ 3は右であると思いましたか?いいえ?私はおそらく間違っている:s。いずれにしても($$、$ 1、...)それらのいずれかを印刷すると、(null)になりますので、何か間違ったことをしています。 – ale

+1

@alemaster:@Chris Lutzは正しいです。ルール内のトークンは1から番号が付けられます。 '$$'はポインタを割り当てることができる変数です。そのポインタはルールの "結果"として取られ、 'rule_decl'を含む他のルールに渡されます。 –

答えて

7

私はyaccの専門家ではありませんが、私がレクサーからパーサへの移行を処理してきた方法は次のとおりです:各レクサートークンについて、別のルールを持って "yytextパーサーに適した形式に変換します。あなたのケースでは、おそらくちょうどyytextに興味があります(コンパイラを書くのなら、それはSyntaxNodeオブジェクトまたはそれに似たものです)。ポイントは最後のルールがidを含むルールによって参照することができ$変数としてyytextが利用できるようにすることです

%token ID RULE 
%token LEFT RIGHT 

%% 

rule_decl: 
    RULE LEFT id RIGHT { printf("%s\n", $3); } 

id: 
    ID { $$ = strdup(yytext); } 

を試してみてください。

+0

Aasmundさんありがとうございました。「エラー: 'yytext'は宣言されていません(この関数では最初に使用されています)」というエラーが発生していますが、おそらく何か不足しています。 – ale

+1

@alemaster:一番上のセクションで 'extern char yytext [];'を使うか、 'extern char * yytext;'を使ってください。 –

+0

素晴らしいです。 FYI:2番目のオプションは機能しましたが、最初は何も印刷されませんでした((nullではなく))。ありがとうございました :)。 – ale

関連する問題