lexer: make CHAR: ! work.

locals-and-roots
John Benediktsson 2016-03-30 21:21:40 -07:00
parent 52a3f6f309
commit 77c256412d
2 changed files with 17 additions and 18 deletions

View File

@ -94,9 +94,22 @@ M: lexer skip-word
: still-parsing-line? ( lexer -- ? )
check-lexer [ column>> ] [ line-length>> ] bi < ;
DEFER: parse-token
: (parse-raw) ( lexer -- str )
check-lexer {
[ column>> ]
[ skip-word ]
[ column>> ]
[ line-text>> ]
} cleave subseq ;
<PRIVATE
: parse-raw ( lexer -- str/f )
dup still-parsing? [
dup skip-blank
dup still-parsing-line?
[ (parse-raw) ] [ dup next-line parse-raw ] if
] [ drop f ] if ;
DEFER: parse-token
: skip-comments ( lexer str -- str' )
dup "!" = [
@ -105,22 +118,8 @@ DEFER: parse-token
nip
] if ;
PRIVATE>
: (parse-token) ( lexer -- str )
dup check-lexer {
[ column>> ]
[ skip-word ]
[ column>> ]
[ line-text>> ]
} cleave subseq skip-comments ;
: parse-token ( lexer -- str/f )
dup still-parsing? [
dup skip-blank
dup still-parsing-line?
[ (parse-token) ] [ dup next-line parse-token ] if
] [ drop f ] if ;
dup parse-raw [ skip-comments ] [ drop f ] if* ;
: ?scan-token ( -- str/f ) lexer get parse-token ;

View File

@ -81,7 +81,7 @@ IN: bootstrap.syntax
"f" [ f suffix! ] define-core-syntax
"CHAR:" [
scan-token {
lexer get parse-raw [ "token" throw-unexpected-eof ] unless* {
{ [ dup length 1 = ] [ first ] }
{ [ "\\" ?head ] [ next-escape >string "" assert= ] }
[ name>char-hook get call( name -- char ) ]