bi

※自分用メモです。bison is what とか、どんな原理で動作するかとかの話は書きません(書けません)。

久しぶりにbison(とflex)で遊ぼうと思ったら使い方を色々忘れてしまいました。紙のノートに記録したものがあったのでそれを参考に自分向けのメモを残しておきます。

■bisonファイルの形式
メモ:二箇所に出てくる「%%」が大事。

%{
/*---- C/C++で色々書く ----*/
%}

/*---- Bison宣言部 ----*/
%token ....
%left ....
%right ....
%union ....

%%

/*---- Bison文法部 ----*/

%%

/*---- C/C++で色々書く(その2) ----*/

void helper_func(){ ... }

■OMake関連ファイルの編集

OSTYPE = msys

open build/C
open build/OCaml
open build/LaTeX

DefineCommandVars()

.SUBDIRS: .
.PHONY : all
.DEFAULT : all

TARGET = simple.exe
OBJS = simple.tab.o simple.lexer.o simple_main.o
HEADERS = simple_lexer.h
PREMATURE=premature.
VALUETYPE = double

INCLUDES += -IC:\MinGW\msys\1.0\include -IC:\MinGW\lib\gcc\mingw32\4.8.1\include
LIBPATHS = -LC:\MinGW\lib -LC:\MinGW\lib\gcc\mingw32\4.8.1
LIBS = -lstdc++ -lm

CXX = g++
CXXFLAGS += -Wall -O2 $(INCLUDES)

all : $(TARGET)

%.o: %.cc
	$(CXX) $(CXXFLAGS) -c -o $@ $< 

simple.lexer.cc : simple.l
	flex -o$(PREMATURE)$@ $<
	grep -v "    #define yyFlexLexer yyFlexLexer"  $(PREMATURE)$@ > $@
	$(RM) $(PREMATURE)$@ 

simple.tab.cc  simple.tab.h  : simple.y
	bison -d --verbose $<
	perl -pe 's/typedef int YYSTYPE/typedef $(VALUETYPE) YYSTYPE/;' simple.tab.c > simple.tab.cc
	sed '53c\#define YYSTYPE $(VALUETYPE)' simple.tab.h > $(PREMATURE)simple.tab.h
	mv $(PREMATURE)simple.tab.h  simple.tab.h

$(TARGET) : $(OBJS)
	$(CXX) -o $@ $(LIBPATHS) $(LIBS) $^

■この記事をかくにあたって参考にした記事:
http://d.hatena.ne.jp/fwtmp/20081209

広告

OMakeを使った(簡易)継続的インテグレーション

※自分用のメモです。色々説明していません。Windows+MSYSが前提。
参考にした記事:たぶんプログラミングとかについて書いていくブログ/OMakeの使い方復習

■目標:foo.py を保存する毎に、自動的に pylint にかけたい。(矢印キーすら打ちたくない)。

■主要なツール:OMake

■例示のための前提となるディレクトリ構成
dev ┐
├ foo.py
└ bar.py

■OMake 関係のファイルを作る

$ pwd
dev
$ ls
bar.py   foo.py
$ omake --install
*** omake: creating OMakeroot
*** omake: creating OMakefile
*** omake: project files OMakefile and OMakeroot have been installed
*** omake: you should edit these files before continuing
$ ls
OMakefile   OMakeroot   bar.py   foo.py

■OMakefileを編集する
以下の行を適当なところに書き加える:

PYLINT = pylint.exe
PATH += C:\Python278-32bit\Scripts\

foo_pylint : foo.py
    $(PYLINT) -E foo.py

■(ゴール):OMakeで foo.py に対して継続的に pylint をかける

$ pwd
dev
$ omake -P foo_pylint

これで、foo.py をエディタ上で保存するたびに pylint -E がかかるようになります。

■追記: Ctrl+C で中断できる(あたりまえ)。