lexのそれ以外のアクション
flex+bisonを使った関数電卓を作る専攻科の実験で、空白処理の質問が出た。
こちらのような mycalc.l だと、空白の場合の処理とか、それ以外の文字が入力された時の処理は記述していない。
lex の出力する C 言語のソースをざらっと読むと、正規表現で指定しないパターンに対しては、そのまま文字を出力する処理( ECHO という入力文字をそのまま出力する #define マクロ)が生成される。だから、例で示したプログラムだと、式として”1+ab2″ を入力すると”ab>>3″と出力される。
%% 文字1 アクション1 # このような処理を書くと、雑な説明でいうなら、以下のような処理が作られる 文字2 アクション2 %% switch( 入力文字 ) { case '文字1' : アクション1 ; break ; case '文字2' : アクション2 ; break ; default : ECHO ; // 入力文字をそのまま出力するマクロ break ; }
このため空白を読み捨てる、それ以外の文字が入力されたら字句解析段階でのエラーを出力するのであれば、lex の正規表現の処理の部分に以下のようなものを追加する必要がある。
[ ¥t] ; /* 空白やタブ文字の時は何もしない */ . { /* それ以外の文字は、エラーメッセージとエラーとなった文字を出力して中断 */ /* 正規表現の . は、任意の1文字という意味 */ printf("lex:error ") ; ECHO ; exit( 1 ) ; }