/* 字句解析の定義 (flex -oyylex.c yylex.l で yylex.c を生成する) 構文木ノードの構造: < ノードのタイプ (整数), 左の子ノードへのポインタ (Node), 右の子ノードへのポインタ (Node) > [注] Node 型は構文木ノードへのポインタを表わす型 */ %{ #include #include "tree.h" /* YYSTYPE をこの中で定義しているので, */ #include "qc.h" /* bison ではこの順に include する必要がある.*/ extern YYSTYPE yylval; /* tree.c で定義 */ Node mkSymNode(char *name); Node mkNumNode(int n); Node mkStrNode(char *name); int lineNo = 1; /* 行番号 */ %} %option noyywrap /* 数字 */ n [0-9] /* 英字 */ a [A-Za-z] /* 英数字 */ an ({a}|{n}) %% [ \t\r]+ { } \n { lineNo++; } var { return VAR; } return { return RETURN; } if { return IF; } else { return ELSE; } while { return WHILE; } "||" { return BRBR; } "&&" { return AMAM; } "==" { return EQEQ; } "!=" { return EXEQ; } "<=" { return LTEQ; } ">=" { return GTEQ; } {a}{an}* { yylval = mkSymNode(yytext); return SYM; } {n}+ { yylval = mkNumNode(atoi(yytext)); return NUM;} \'.\' { yylval = mkNumNode(yytext[1]); return NUM;} \"([^"\n\r\\]|\\.)*\" { yylval = mkStrNode(yytext); return STR; } . { return yytext[0]; } "//".*$ { } %%