summaryrefslogtreecommitdiffstats
path: root/parser.y
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2009-11-21 11:12:20 -0800
committerKaz Kylheku <kaz@kylheku.com>2009-11-21 11:12:20 -0800
commit4a1556a848c5bfb527cecb2b823a750ba63e6f80 (patch)
treebe9378666222056692e4770a8f0eb79b45ef8993 /parser.y
parent00f823aee439ed8c2cdd71dfbb89385dc68eae7b (diff)
downloadtxr-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.y26
1 files changed, 14 insertions, 12 deletions
diff --git a/parser.y b/parser.y
index 0ababe57..c69c1b33 100644
--- a/parser.y
+++ b/parser.y
@@ -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); }