teratailに、flexを動かすコードの一部を改変したいという質問があったので回答しようと思っていましたが、質問を取り下げたみたいなのでQiita記事にアップしておきます。
回答
flexというのはレキシカルパーサ(字句解析)ツールのことであって、あなたはコンパイラか何かを作りたいということでよろしいでしょうか。もしそうであれば、あなたはC言語の初歩的な扱い方を理解していないのでflexとyacc(またはbison)を正しく扱えないと考えます。
コンパイラを作るには
コンパイラはこのような工程を経ます(すいません、手元に文献がないのでwikipediaを参考にしています)。
- 字句解析
- 構文解析
- 中間コード生成(省略可能)
- 最適化
- コード生成
コンパイラのフロントエンドと呼ばれる部分は字句解析と構文解析ですが、そのためにflexとyaccを援用します。コンパイラを作成する方法としては、フルスクラッチで記述する方法が最近の流行だったと思います。flex, yaccと同じくらいポピュラーな方法としてはLVMMを使用することです。
コンパイラのフロントエンドを理解する3ステップ
コンパイラのフロントエンドはテキストを解釈するのでパーサーと呼ばれますが、これを理解するためにはこの手順を踏まなければなりません。
- printf, scanfのフォーマットを理解する
- 正規表現を理解する
- パーサージェネレータ(yacc, bison, LVMM等)用の記述方法を理解する
各ステップの間には目に見えない壁があります。一朝一夕でできるようなものではなく、たいていのプログラマはパーサージェネレータを使うことを断念します。
問題の箇所は?
今回の問題の箇所は、printf, scanf, fopenと続く3文です。ここは普通のCプログラマなら分かって当然の箇所であり、例えばabc.txt
を入力にしたければyyin = fopen("abc.txt", "r");
と書けばいいということは誰にも分かることです。つまり、質問者さんは先ほどの「コンパイラのフロントエンドを理解する3ステップ」の1ステップ目も達成できていないわけです。
そのようなわけで、プログラミングというのは本を読んでやればできるというような甘いものではありません。プログラミングに関する膨大なトピックのうち、分かりやすいものを自分で見つけてきて少しずつ吸収するといったことが必要になります。
printf, scanfを含んだC言語の初歩を学ぶ一番の方法はAOJ(Aizu Online Judge)の初歩的な問題を解くことです。C言語の信頼できるソースとしてはC言語の仕様書がありますが、これは有料です。UNIXのmanページ(これはインターネットで「printf man」などと検索すれば出てきます)は割と正確です。仕様書のドラフト(草稿、未定稿、途中の稿のこと)がネット上にアップされているのでそれを活用している人もいます。基本的にはインターネットで検索して情報収集することになりますが、できるだけ信頼性の高いサイトを見ることをおすすめします。