ユーザーは、他のプログラミング言語でルーチンを使用する場合と同じようにして lex ルーチンを使用できます。複数の規則で使用されるアクションのコードは、1 度だけ作成して、必要なときに呼び出すことができます。定義の場合と同様に、このルーチンによってプログラムの記述が簡素化され、コードも読みやすくなります。
「lex と yacc の併用」で説明している put_in_tab1() 関数は、lex 仕様のユーザールーチンのセクションで使用するのに適した関数です。
このセクションにルーチンを配置するもう 1 つの理由は、コードを使用する規則が 1 つしかない場合であっても、重要なコードを強調したり規則セクションを簡素化するためです。例として、/* と */ に挟まれた部分がコメントになっている C のような言語のコメントを無視する以下のルーチンについて説明します。
%{ static skipcmnts(); %} %% "/*" skipcmnts(); ... ... /* 残りの規則 */ %% static skipcmnts() { for(;;) { while (input() != '*') ; if (input() != '/') unput(yytext[yyleng-1]) else return; } }
この例には、重要なポイントが 3 つあります。