読者です 読者をやめる 読者になる 読者になる

ochalog

Ruby と MediaWiki が好きな電子・情報系の学生のブログ。

じくかいせきつーる 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

数字を >>>数字<<< に変換し、最後に合計を出すことができた。