Skip to content

Instantly share code, notes, and snippets.

@twinbird
Created February 15, 2016 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save twinbird/863e59cafeba070fe736 to your computer and use it in GitHub Desktop.
Save twinbird/863e59cafeba070fe736 to your computer and use it in GitHub Desktop.
/*
* 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