Created
February 15, 2016 14:03
-
-
Save twinbird/863e59cafeba070fe736 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Cプログラムの行数を数え, | |
* コメントを印字するプログラム | |
*/ | |
/* ここから定義部 */ | |
/* Cと同じ記法でここはコメントになります */ | |
/* yaccと連携するためのmain関数を出力しないオプション */ | |
%option noyywrap | |
/* | |
* %{と%}で囲まれた部分は(間にスペースは入れちゃダメ) | |
* そのまま出力されるファイルに反映されます. | |
*/ | |
%{ | |
#include <stdio.h> | |
int line = 1; | |
%} | |
/* マクロ定義 */ | |
/* 解析中の状態を表すための定義 */ | |
%state COMMENT | |
/* 定数定義もできる */ | |
COMIN \/\* | |
COMOUT \*\/ | |
/* ここまで定義部 */ | |
%% | |
/* ここから規則定義部 */ | |
/* 規則定義部では正規表現と区別するために | |
* コメントはインデントの後から | |
* 記述する必要があります. | |
*/ | |
<INITIAL>\"[^\"]*\" ; /* 文字列リテラルにマッチ */ | |
<INITIAL>{COMIN} {BEGIN COMMENT;} /* コメント開始 */ | |
<COMMENT>. {printf("%s", yytext);} /* コメントを印字.yytextにはマッチしたテキストが入っている */ | |
<COMMENT>"\n" {line++;printf("%s", yytext);} /* コメント内での改行.コメントを印字し,改行分行数を増やす */ | |
<COMMENT>{COMOUT} {BEGIN INITIAL;} /* コメントを抜ける */ | |
<INITIAL>. ; /* コメント外のマッチ */ | |
<INITIAL>"\n" {line++;} /* コメント外で改行にマッチ.行数を増やす */ | |
/* ここまで規則定義部 */ | |
%% | |
/* ここからはCコードの領域 */ | |
/* | |
* 今回利用するmainプログラム | |
* 通常はyacc等と連携したりする場合が多いと思う. | |
*/ | |
int main(void) { | |
yylex(); /* lex処理の呼び出し */ | |
printf("\n%d lines read.\n", line); /* 処理後のカウントした行数を印字 */ | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment