ホーム » 2022 » 5月 » 10

日別アーカイブ: 2022年5月10日

2022年5月
1234567
891011121314
15161718192021
22232425262728
293031  

最新の投稿(電子情報)

アーカイブ

カテゴリー

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 ) ;
      }