| Index: bison/src/bison/2.4.1/bison-2.4.1-src/examples/calc++/calc++-scanner.ll
|
| ===================================================================
|
| --- bison/src/bison/2.4.1/bison-2.4.1-src/examples/calc++/calc++-scanner.ll (revision 0)
|
| +++ bison/src/bison/2.4.1/bison-2.4.1-src/examples/calc++/calc++-scanner.ll (revision 0)
|
| @@ -0,0 +1,73 @@
|
| +%{ /* -*- C++ -*- */
|
| +# include <cstdlib>
|
| +# include <errno.h>
|
| +# include <limits.h>
|
| +# include <string>
|
| +# include "calc++-driver.hh"
|
| +# include "calc++-parser.hh"
|
| +
|
| +/* Work around an incompatibility in flex (at least versions
|
| + 2.5.31 through 2.5.33): it generates code that does
|
| + not conform to C89. See Debian bug 333231
|
| + <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>. */
|
| +# undef yywrap
|
| +# define yywrap() 1
|
| +
|
| +/* By default yylex returns int, we use token_type.
|
| + Unfortunately yyterminate by default returns 0, which is
|
| + not of token_type. */
|
| +#define yyterminate() return token::END
|
| +%}
|
| +
|
| +%option noyywrap nounput batch debug
|
| +
|
| +id [a-zA-Z][a-zA-Z_0-9]*
|
| +int [0-9]+
|
| +blank [ \t]
|
| +
|
| +%{
|
| +# define YY_USER_ACTION yylloc->columns (yyleng);
|
| +%}
|
| +%%
|
| +%{
|
| + yylloc->step ();
|
| +%}
|
| +{blank}+ yylloc->step ();
|
| +[\n]+ yylloc->lines (yyleng); yylloc->step ();
|
| +
|
| +%{
|
| + typedef yy::calcxx_parser::token token;
|
| +%}
|
| + /* Convert ints to the actual type of tokens. */
|
| +[-+*/] return yy::calcxx_parser::token_type (yytext[0]);
|
| +":=" return token::ASSIGN;
|
| +{int} {
|
| + errno = 0;
|
| + long n = strtol (yytext, NULL, 10);
|
| + if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
|
| + driver.error (*yylloc, "integer is out of range");
|
| + yylval->ival = n;
|
| + return token::NUMBER;
|
| +}
|
| +{id} yylval->sval = new std::string (yytext); return token::IDENTIFIER;
|
| +. driver.error (*yylloc, "invalid character");
|
| +%%
|
| +
|
| +void
|
| +calcxx_driver::scan_begin ()
|
| +{
|
| + yy_flex_debug = trace_scanning;
|
| + if (file == "-")
|
| + yyin = stdin;
|
| + else if (!(yyin = fopen (file.c_str (), "r")))
|
| + {
|
| + error (std::string ("cannot open ") + file);
|
| + exit (1);
|
| + }
|
| +}
|
| +
|
| +void
|
| +calcxx_driver::scan_end ()
|
| +{
|
| + fclose (yyin);
|
| +}
|
|
|