diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2009-11-21 11:12:20 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2009-11-21 11:12:20 -0800 |
commit | 4a1556a848c5bfb527cecb2b823a750ba63e6f80 (patch) | |
tree | be9378666222056692e4770a8f0eb79b45ef8993 /parser.y | |
parent | 00f823aee439ed8c2cdd71dfbb89385dc68eae7b (diff) | |
download | txr-4a1556a848c5bfb527cecb2b823a750ba63e6f80.tar.gz txr-4a1556a848c5bfb527cecb2b823a750ba63e6f80.tar.bz2 txr-4a1556a848c5bfb527cecb2b823a750ba63e6f80.zip |
Introducing symbol packages. Internal symbols are now in
a system package instead of being hacked with the $ prefix.
Keyword symbols are provided. In the matcher, evaluation
is tightened up. Keywords, nil and t are not bindeable, and
errors are thrown if attempts are made to bind them.
Destructuring in dest_bind is strict in the number of items.
String streams are exploited to print bindings to objects
that are not strings or characters. Numerous bugfixes.
Diffstat (limited to 'parser.y')
-rw-r--r-- | parser.y | 26 |
1 files changed, 14 insertions, 12 deletions
@@ -53,7 +53,7 @@ static val parsed_spec; long num; } -%token <lexeme> TEXT IDENT ALL SOME NONE MAYBE CASES AND OR END COLLECT +%token <lexeme> TEXT IDENT KEYWORD ALL SOME NONE MAYBE CASES AND OR END COLLECT %token <lexeme> UNTIL COLL OUTPUT REPEAT REP SINGLE FIRST LAST EMPTY DEFINE %token <lexeme> TRY CATCH FINALLY %token <num> NUMBER @@ -380,26 +380,26 @@ rep_parts_opt : SINGLE o_elems_opt2 /* This sucks, but factoring '*' into a nonterminal * that generates an empty phrase causes reduce/reduce conflicts. */ -var : IDENT { $$ = list(var, intern(string_own($1)), +var : IDENT { $$ = list(var, intern(string_own($1), nil), nao); } - | IDENT elem { $$ = list(var, intern(string_own($1)), + | IDENT elem { $$ = list(var, intern(string_own($1), nil), $2, nao); } - | '{' IDENT '}' { $$ = list(var, intern(string_own($2)), + | '{' IDENT '}' { $$ = list(var, intern(string_own($2), nil), nao); } - | '{' IDENT '}' elem { $$ = list(var, intern(string_own($2)), + | '{' IDENT '}' elem { $$ = list(var, intern(string_own($2), nil), $4, nao); } - | '{' IDENT regex '}' { $$ = list(var, intern(string_own($2)), + | '{' IDENT regex '}' { $$ = list(var, intern(string_own($2), nil), nil, cons(regex_compile($3), $3), nao); } - | '{' IDENT NUMBER '}' { $$ = list(var, intern(string_own($2)), + | '{' IDENT NUMBER '}' { $$ = list(var, intern(string_own($2), nil), nil, num($3), nao); } - | var_op IDENT { $$ = list(var, intern(string_own($2)), + | var_op IDENT { $$ = list(var, intern(string_own($2), nil), nil, $1, nao); } - | var_op IDENT elem { $$ = list(var, intern(string_own($2)), + | var_op IDENT elem { $$ = list(var, intern(string_own($2), nil), $3, $1, nao); } - | var_op '{' IDENT '}' { $$ = list(var, intern(string_own($3)), + | var_op '{' IDENT '}' { $$ = list(var, intern(string_own($3), nil), nil, $1, nao); } - | var_op '{' IDENT '}' elem { $$ = list(var, intern(string_own($3)), + | var_op '{' IDENT '}' elem { $$ = list(var, intern(string_own($3), nil), $5, $1, nao); } | var_op '{' IDENT regex '}' { $$ = nil; yyerror("longest match " @@ -428,7 +428,9 @@ exprs : expr { $$ = cons($1, nil); } | expr '.' expr { $$ = cons($1, $3); } ; -expr : IDENT { $$ = intern(string_own($1)); } +expr : IDENT { $$ = intern(string_own($1), nil); } + | KEYWORD { $$ = intern(string_own($1), + keyword_package); } | NUMBER { $$ = num($1); } | list { $$ = $1; } | regex { $$ = cons(regex_compile($1), $1); } |