diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-11-07 20:50:20 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-11-07 20:50:20 -0800 |
commit | a2ea64e158ad9be884482747b45a90e27579f9f1 (patch) | |
tree | aa4640188bcd4e4d9320f1eb9302452c3892599d /parser.y | |
parent | 4af3611c835e9b6acb979987568f46ba86ef52e7 (diff) | |
download | txr-a2ea64e158ad9be884482747b45a90e27579f9f1.tar.gz txr-a2ea64e158ad9be884482747b45a90e27579f9f1.tar.bz2 txr-a2ea64e158ad9be884482747b45a90e27579f9f1.zip |
Support #: reading for uninterned symbols.
* parser.l (BTKEY, NTKEY): Renamed to BTKWUN and NTKWUN
("keyword and uninterned") respectively. Include an
optional match for the # character.
(BTOK, NTOK): Refer to BTKEY and NTKEY respectively
* parser.y (sym_helper): Implement uninterned symbols
by detecting when the package name string is "#"
and handling specially.
* txr.1: Documented package prefixes and uninterned
symbols.
Diffstat (limited to 'parser.y')
-rw-r--r-- | parser.y | 16 |
1 files changed, 10 insertions, 6 deletions
@@ -1249,7 +1249,7 @@ static val sym_helper(parser_t *parser, wchar_t *lexeme, val meta_allowed) int leading_at = *lexeme == L'@'; wchar_t *tokfree = lexeme; wchar_t *colon = wcschr(lexeme, L':'); - val sym_name = nil, pkg_name = nil, package = nil, sym; + val sym_name = nil, pkg_name = nil, package = user_package, sym; if (leading_at) { if (!meta_allowed) { @@ -1270,13 +1270,17 @@ static val sym_helper(parser_t *parser, wchar_t *lexeme, val meta_allowed) free(tokfree); } else if (colon != 0) { pkg_name = string(lexeme); - package = find_package(pkg_name); sym_name = string(colon + 1); scrub_scanner(parser->scanner, SYMTOK, tokfree); free(tokfree); - if (!package) { - yyerrorf(scnr, lit("~a:~a: package ~a not found"), pkg_name, sym_name, pkg_name, nao); - return nil; + if (equal(pkg_name, lit("#"))) { + package = nil; + } else { + package = find_package(pkg_name); + if (!package) { + yyerrorf(scnr, lit("~a:~a: package ~a not found"), pkg_name, sym_name, pkg_name, nao); + return nil; + } } } else { sym_name = string(lexeme); @@ -1284,7 +1288,7 @@ static val sym_helper(parser_t *parser, wchar_t *lexeme, val meta_allowed) free(tokfree); } - sym = intern(sym_name, package); + sym = package ? intern(sym_name, package) : make_sym(sym_name); return leading_at ? rl(list(var_s, sym, nao), num(parser->lineno)) : sym; } |