Mercurial > hg > Members > nobuyasu > SampleSource
comparison Bison-Flex/CALC/Bison-Flex/EUC/calc-scanner.ll @ 0:db40c85cad7a default tip
upload sample source
author | nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 09 May 2011 03:11:59 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:db40c85cad7a |
---|---|
1 %{ | |
2 #include <cstdlib> | |
3 #include <cerrno> | |
4 #include <climits> | |
5 #include <string> | |
6 #include "calc-driver.h" | |
7 #include "calc-parser.hh" | |
8 | |
9 #ifdef _MSC_VER | |
10 #pragma warning(disable:4018) | |
11 #pragma warning(disable:4102) | |
12 #pragma warning(disable:4244) | |
13 #pragma warning(disable:4267) | |
14 #pragma warning(disable:4996) | |
15 #endif | |
16 | |
17 #undef yywrap | |
18 #define yywrap() 1 | |
19 | |
20 #define yyterminate() return token::TK_EOF | |
21 %} | |
22 | |
23 %option noyywrap nounput batch | |
24 %option never-interactive | |
25 %option noyy_scan_buffer | |
26 %option noyy_scan_bytes | |
27 %option noyy_scan_string | |
28 %option nounistd | |
29 | |
30 id [a-zA-Z_][a-zA-Z_0-9]* | |
31 int [1-9][0-9]* | |
32 blank [ \t] | |
33 | |
34 %% | |
35 %{ | |
36 typedef yy::calc_parser::token token; | |
37 | |
38 std::string string_buffer; | |
39 %} | |
40 | |
41 "list" return token::TK_LIST; | |
42 "print" return token::TK_PRINT; | |
43 | |
44 [-+*/=()\n] return yy::calc_parser::token_type(yytext[0]); | |
45 | |
46 {blank}+ ; | |
47 {int} { | |
48 errno = 0; | |
49 long n = strtol(yytext, NULL, 10); | |
50 if (n < LONG_MIN || n > LONG_MAX || errno == ERANGE) | |
51 driver.error("整数が範囲外です。"); | |
52 yylval->ival = n; | |
53 return token::TK_IVAL; | |
54 } | |
55 "0" { | |
56 yylval->ival = 0; | |
57 return token::TK_IVAL; | |
58 } | |
59 {id} { | |
60 yylval->sval = new std::string(yytext); | |
61 return token::TK_IDENTIFIER; | |
62 } | |
63 . driver.error("この文字を識別子で使用することはできません。"); | |
64 | |
65 %% | |
66 | |
67 void calc_driver::scan_begin() | |
68 { | |
69 if ((yyin = fopen(file.c_str(), "r")) == 0) | |
70 error(file + " がオープンできません。"); | |
71 } | |
72 | |
73 void calc_driver::scan_end() | |
74 { | |
75 fclose(yyin); | |
76 yylex_destroy(); | |
77 } |