ext/yylex.re in cast-0.1.0 vs ext/yylex.re in cast-0.2.0
- old
+ new
@@ -32,15 +32,15 @@
set_func(FloatLiteral, format);
set_func(FloatLiteral, val);
set_func(FloatLiteral, suffix);
new_func(CharLiteral);
-set_func(CharLiteral, wide);
+set_func(CharLiteral, prefix);
set_func(CharLiteral, val);
new_func(StringLiteral);
-set_func(StringLiteral, wide);
+set_func(StringLiteral, prefix);
set_func(StringLiteral, val);
/*
* -------------------------------------------------------------------
* yylex
@@ -87,12 +87,11 @@
N = [1-9];
L = [a-zA-Z_];
E = [Ee] [+-]? D+;
P = [Pp] [+-]? D+;
FS = [fFlL];
- IS = [uUlL]+;
-
+ IS = [uU] ([lL] | "ll" | "LL")? | ([lL] | "ll" | "LL") [uU]?;
ESC = [\\] ([abfnrtv?'"\\] | O (O O?)? | "x" H+);
*/
/*!re2c
"/*" { goto comment; }
"//" { goto comment2; }
@@ -143,77 +142,73 @@
} else {
RETVALUE(cast_sym_ID);
}
}
- SUF = L(L|D)*;
-
- "0" [xX] H+ SUF? {
+ "0" [xX] H+ IS? {
value = cast_new_IntLiteral_at(p->lineno);
cast_IntLiteral_set_format(value, ID2SYM(rb_intern("hex")));
cast_IntLiteral_set_val(value, LONG2NUM(strtol(p->tok, (char **)&cp, 16)));
if (cp < cursor)
cast_IntLiteral_set_suffix(value, rb_str_new(cp, cursor - cp));
RETVALUE(cast_sym_ICON);
}
- "0" D+ SUF? {
+ "0" D+ IS? {
value = cast_new_IntLiteral_at(p->lineno);
cast_IntLiteral_set_format(value, ID2SYM(rb_intern("oct")));
cast_IntLiteral_set_val(value, LONG2NUM(strtol(p->tok, (char **)&cp, 8)));
if (cp < cursor) {
if (cp[0] == '8' || cp[0] == '9')
rb_raise(cast_eParseError, "bad octal digit: %c", cp[0]);
cast_IntLiteral_set_suffix(value, rb_str_new(cp, cursor - cp));
}
RETVALUE(cast_sym_ICON);
}
- ( "0" | [1-9] D* ) SUF? {
+ ( "0" | [1-9] D* ) IS? {
value = cast_new_IntLiteral_at(p->lineno);
cast_IntLiteral_set_format(value, ID2SYM(rb_intern("dec")));
cast_IntLiteral_set_val(value, LONG2NUM(strtol(p->tok, (char **)&cp, 10)));
if (cp < cursor)
cast_IntLiteral_set_suffix(value, rb_str_new(cp, cursor - cp));
RETVALUE(cast_sym_ICON);
}
- ( D+ E | D* "." D+ E? | D+ "." D* E? ) SUF? {
+ ( D+ E | D* "." D+ E? | D+ "." D* E? ) FS? {
value = cast_new_FloatLiteral_at(p->lineno);
cast_FloatLiteral_set_format(value, ID2SYM(rb_intern("dec")));
cast_FloatLiteral_set_val(value, rb_float_new(strtod(p->tok, (char **)&cp)));
if (cp < cursor)
cast_FloatLiteral_set_suffix(value, rb_str_new(cp, cursor - cp));
RETVALUE(cast_sym_FCON);
}
- ( "0" [Xx] (H+ P | H* "." H+ P? | H+ "." H* P?) ) SUF? {
+ ( "0" [Xx] (H+ P | H* "." H+ P? | H+ "." H* P?) ) FS? {
value = cast_new_FloatLiteral_at(p->lineno);
cast_FloatLiteral_set_format(value, ID2SYM(rb_intern("hex")));
cast_FloatLiteral_set_val(value, rb_float_new(strtod(p->tok, (char **)&cp)));
if (cp < cursor)
cast_FloatLiteral_set_suffix(value, rb_str_new(cp, cursor - cp));
RETVALUE(cast_sym_FCON);
}
- L? ['] (ESC|any\[\n\\'])+ ['] {
+ L? ['] (ESC|any\[\\'])+ ['] {
value = cast_new_CharLiteral_at(p->lineno);
- if (p->tok[0] == 'L') {
- cast_CharLiteral_set_wide(value, Qtrue);
- cp = p->tok + 1;
- } else {
- cast_CharLiteral_set_wide(value, Qfalse);
+ if (p->tok[0] == '\'') {
cp = p->tok;
+ } else {
+ cast_CharLiteral_set_prefix(value, rb_str_new(p->tok, 1));
+ cp = p->tok + 1;
}
cast_CharLiteral_set_val(value, rb_str_new(cp + 1, cursor - cp - 2));
RETVALUE(cast_sym_CCON);
}
- L? ["] (ESC|any\[\n\\"])* ["] {
+ L? ["] (ESC|any\[\\"])* ["] {
value = cast_new_StringLiteral_at(p->lineno);
- if (p->tok[0] == 'L') {
- cast_StringLiteral_set_wide(value, Qtrue);
- cp = p->tok + 1;
- } else {
- cast_StringLiteral_set_wide(value, Qfalse);
+ if (p->tok[0] == '"') {
cp = p->tok;
+ } else {
+ cast_StringLiteral_set_prefix(value, rb_str_new(p->tok, 1));
+ cp = p->tok + 1;
}
cast_StringLiteral_set_val(value, rb_str_new(cp + 1, cursor - cp - 2));
RETVALUE(cast_sym_SCON);
}
@@ -283,12 +278,11 @@
goto std;
}
any
{
- //printf("unexpected character: %c\n", *p->tok);
- rb_raise(cast_eParseError, "%d: unexpected character: %c (ASCII %d)\n", p->lineno, *p->tok, (int)*p->tok);
+ rb_raise(cast_eParseError, "%ld: unexpected character: %c (ASCII %d)\n", p->lineno, *p->tok, (int)*p->tok);
goto std;
}
*/
comment:
@@ -302,10 +296,10 @@
[\000]
{
if (cursor == p->eof)
rb_raise(cast_eParseError,
- "%d: unclosed multiline comment",
+ "%ld: unclosed multiline comment",
p->lineno);
}
any { goto comment; }
*/