%{ /*=================================================================== lex.ll: mini-C プログラムの lex ファイル コンパイラ演習 2004 (c) 平岡佑介, 石浦菜岐佐 =====================================================================*/ /********************************************************************* A パート ( %} の行まで) ・字句解析の C プログラムの冒頭ににそのまま取り込まれる ・ヘッダのインクルードやグローバル変数の宣言等をここに書く *********************************************************************/ #include "lex.h" int linenum; /********************************************************************* B パート ( %} の 次の行から %% の行まで ) ・正規表現の定義 ・C パートに書くには少し複雑なパターンをここに定義する *********************************************************************/ %} %{ /********************************************************************* C パート (%% の行から次の %% の行まで) ・字句のパターンと, それを見つけたときのアクションを書く *********************************************************************/ %} %% "char" { return lex_KW_CHAR; } "int" { return lex_KW_INT; } "&" { return lex_AND; } "==" { return lex_EQEQ; } . { fprintf(stderr, "%d: 不正な文字 '%c'\n", linenum, yytext[0]); exit(4);} %% /********************************************************************* D パート ・字句解析の C プログラムの末尾にそのまま取り込まれる ・関数の実装等をここに書く *********************************************************************/ /*============================================ * yyerror() * 構文解析のエラー時に yacc から呼び出される *============================================*/ void yyerror(const char *s) { fprintf(stderr, "line %d: %s\n", linenum, s); exit(1); } /*============================================ * yywrap() * ファイル1つだけを扱う場合は, 常に 1 を返す *============================================*/ int yywrap() { return 1; }