1. ホーム
  2. windows

[解決済み] WindowsでLEX/YACCファイルをコンパイルするには?

2022-03-16 23:56:03

質問

私は、次のような問題を抱えています。 LexYACC ファイルを使用して、私のファイルをパースします ( .l ファイルと .y ファイル)を作成します。

それらのファイルをどのようにコンパイルし、どのように同等の .c のファイルを作成することはできますか?

解決方法は?

本日(2011-04-05、2017-11-29更新)時点では、以下の最新版が必要です。

  1. flex-2.5.4a-1.exe

  2. bison-2.4.1-setup.exe

  3. その後、お好みのディレクトリにフルインストールします。 名前にスペースがない場合 . 私のお勧めは C:\GnuWin32 . する ない にインストールします。 デフォルト (C:\Program Files (x86)\GnuWin32) なぜなら bison は括弧はともかく、ディレクトリ名のスペースに問題があるからです。

  4. また、以下のインストールもご検討ください。 デブCPP をデフォルトのディレクトリ ( C:\Dev-Cpp )

  5. その後、PATH変数に、以下のbinディレクトリが含まれるように設定します。 gccC:\Dev-Cpp\bin ) と flex\bisonC:\GnuWin32\bin ). そのためには、これをコピーしてください。 ;C:\Dev-Cpp\bin;C:\GnuWin32\bin の末尾に追加してください。 PATH という変数があり、この図のような場所で定義されています。

    図の解像度が悪い場合は ステップバイステップ .

  6. プロンプトを開き、".l" と ".y" があるディレクトリに cd して、次のようにコンパイルしてください。

    1. flex hello.l
    2. bison -dy hello.y
    3. gcc lex.yy.c y.tab.c -o hello.exe

プログラムを実行することができるようになります。簡単なテスト用にソースを作ってみました(悪名高き Hello World ):

こんにちは。

%{

#include "y.tab.h"
int yyerror(char *errormsg);

%}

%%

("hi"|"oi")"\n"       { return HI;  }
("tchau"|"bye")"\n"   { return BYE; }
.                     { yyerror("Unknown char");  }

%%

int main(void)
{
   yyparse();
   return 0;
}

int yywrap(void)
{
   return 0;
}

int yyerror(char *errormsg)
{
    fprintf(stderr, "%s\n", errormsg);
    exit(1);
}

こんにちは。

%{

#include <stdio.h>
#include <stdlib.h>
int yylex(void);
int yyerror(const char *s);

%}

%token HI BYE

%%

program: 
         hi bye
        ;

hi:     
        HI     { printf("Hello World\n");   }
        ;
bye:    
        BYE    { printf("Bye World\n"); exit(0); }
         ;


編集: "warning: yyerror と yylex の暗黙の定義" を避けました。

免責事項:この回答は非常に古い(2011年以降!)ので、バージョンや機能の変更によって問題に遭遇した場合、新しいitensを反映するためにこの回答を更新することができないので、もっと調査が必要かもしれないことを思い出してください。この回答があなたにとって良い入口になることを願っています。

アップデート:何か(本当に小さな変更)が必要な場合は、githubの公式リポジトリをチェックしてください。 https://github.com/drbeco/hellex

ハッキングを楽しんでください。