じくかいせきつーる flex のれんしゅう
最近、青学 Martin J. Dürst 先生の「言語理論とコンパイラ」の講義資料で字句解析と構文解析を勉強中。ダイスボットのコマンドに利用できればと。
リポジトリも作ってみた。
https://github.com/ochaochaocha3/duerst-compiler
字句解析
まだ始めたばかりであまり分かっていないが、とりあえず「字句解析には正規表現が使える」ということが分かった(第 2 回「形式言語の重要性、種類、定義」)。flex を使うと正規表現から字句解析器を生成できることが分かった。
flex の入力形式
- 宣言部は
%{ %}
で囲んだ方が無難に感じた。インデントが面倒なので。 - 同じく、C 言語の実行文も
{ }
で囲んだ方が無難。
%{ 宣言等 %} %% 正規表現 { 実行文 } %% 関数等
flex のれんしゅう
第 5 回「字句解析ツール flex」の演習問題をやった。
演習 3「数字の発見」では、ちょっと改造して発見した数字の合計を表示するようにしてみた。
search-nums.l
%{ long sum_of_nums = 0; long num; %} %% [0-9]+ { sscanf(yytext, "%ld", &num); sum_of_nums += num; printf(">>>%s<<<", yytext); } %% int main(void) { yylex(); printf("\nSum of numbers = %ld\n", sum_of_nums); return 0; } int yywrap(void) { return 1; }
入力例
srw_wiki-mainpage.txt。スパロボ Wikiのトップページから。
ようこそ スーパーロボット大戦Wiki へ スーパーロボット大戦(スパロボ)シリーズについてのあらゆる用語・話題をまとめるwikiです。お役に立てばリンクして紹介などしていただければ幸いです。 初めての方は「参加案内」を参照してください。 詳しい書き方は「記事制作のポイント」を参考にしてください。 書式については「ヘルプ:編集」や「ヘルプ:書式」を参照してください。 意見交換は以下のページにてお願いします。 各ページについての意見交換は該当ページのトークページにて。 複数ページ、wiki全体についての意見交換は「BBS/2015」にて。 新規ページ作成は登録利用者のみ行えます。荒らし防止のため、ご了承願います。アカウント作成はこちらから。 現在、スーパーロボット大戦Wikiには約 8437 本の記事があります。詳しい統計は「特別:統計」や「スーパーロボット大戦Wiki 統計」を参照してください。 重要なお知らせ 『第3次スーパーロボット大戦Z天獄篇』発表に伴う編集保護を解除しました。ご協力ありがとうございました。 Wikipedia等で採用されているガジェットが利用できるようになりました。ご利用になるには、アカウント作成後、「個人設定」→「ガジェット」から有効化してください。 メンテナンス情報/2014-10-30 脚注機能が利用できます。詳しくは「ヘルプ:脚注」をご参照ください。
出力例
以下の出力。
./search-nums < srw_wiki-mainpage.txt
結果は以下のとおり。
ようこそ スーパーロボット大戦Wiki へ スーパーロボット大戦(スパロボ)シリーズについてのあらゆる用語・話題をまとめるwikiです。お役に立てばリンクして紹介などしていただければ幸いです。 初めての方は「参加案内」を参照してください。 詳しい書き方は「記事制作のポイント」を参考にしてください。 書式については「ヘルプ:編集」や「ヘルプ:書式」を参照してください。 意見交換は以下のページにてお願いします。 各ページについての意見交換は該当ページのトークページにて。 複数ページ、wiki全体についての意見交換は「BBS/>>>2015<<<」にて。 新規ページ作成は登録利用者のみ行えます。荒らし防止のため、ご了承願います。アカウント作成はこちらから。 現在、スーパーロボット大戦Wikiには約 >>>8437<<< 本の記事があります。詳しい統計は「特別:統計」や「スーパーロボット大戦Wiki 統計」を参照してください。 重要なお知らせ 『第>>>3<<<次スーパーロボット大戦Z天獄篇』発表に伴う編集保護を解除しました。ご協力ありがとうございました。 Wikipedia等で採用されているガジェットが利用できるようになりました。ご利用になるには、アカウント作成後、「個人設定」→「ガジェット」から有効化してください。 メンテナンス情報/>>>2014<<<->>>10<<<->>>30<<< 脚注機能が利用できます。詳しくは「ヘルプ:脚注」をご参照ください。 Sum of numbers = 12509
数字を >>>数字<<<
に変換し、最後に合計を出すことができた。