support dotted list

This commit is contained in:
Yuichi Nishiwaki 2013-10-17 18:14:18 +09:00
parent 87aae8dd8f
commit 458ac6b9ab
2 changed files with 8 additions and 7 deletions

View File

@ -24,7 +24,7 @@ struct parser_control {
%token <datum> tSYMBOL tNUMBER tBOOLEAN %token <datum> tSYMBOL tNUMBER tBOOLEAN
%type <datum> datum simple_datum symbol compound_datum %type <datum> datum simple_datum symbol compound_datum
%type <datum> number list list_tail %type <datum> number list list_data
%% %%
@ -70,22 +70,22 @@ compound_datum
; ;
list list
: tLPAREN list_tail : tLPAREN list_data tRPAREN
{ {
$$ = $2; $$ = $2;
} }
; ;
list_tail list_data
: tRPAREN : /* none */
{ {
$$ = pic_nil_value(); $$ = pic_nil_value();
} }
| datum tDOT datum tRPAREN | datum tDOT datum
{ {
$$ = pic_cons(p->pic, $1, $3); $$ = pic_cons(p->pic, $1, $3);
} }
| datum list_tail | datum list_data
{ {
$$ = pic_cons(p->pic, $1, $2); $$ = pic_cons(p->pic, $1, $2);
} }

View File

@ -18,7 +18,7 @@ struct parser_control {
boolean #t|#f|#true|#false boolean #t|#f|#true|#false
/* symbol */ /* symbol */
identifier [a-z0-9A-Z+-/*?<=>_]+ identifier [a-z0-9A-Z+-/*?<=>_.]+
/* number */ /* number */
digit [0-9] digit [0-9]
@ -30,6 +30,7 @@ infnan "+inf.0"|"-inf.0"|"+nan.0"|"-nan.0"
%% %%
[ \t\n\r] /* skip whitespace */ [ \t\n\r] /* skip whitespace */
"." return tDOT;
"(" return tLPAREN; "(" return tLPAREN;
")" return tRPAREN; ")" return tRPAREN;
{boolean} { yylval.datum = pic_bool_value(strcmp(yytext, "#t") == 0 || strcmp(yytext, "#true") == 0); return tBOOLEAN; } {boolean} { yylval.datum = pic_bool_value(strcmp(yytext, "#t") == 0 || strcmp(yytext, "#true") == 0); return tBOOLEAN; }