299 lines
8.8 KiB
Factor
299 lines
8.8 KiB
Factor
! Copyright (C) 2004, 2010 Slava Pestov.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: accessors arrays byte-arrays byte-vectors
|
|
classes classes.algebra.private classes.builtin classes.error
|
|
classes.intersection classes.maybe classes.mixin classes.parser
|
|
classes.predicate classes.singleton classes.tuple classes.tuple.parser
|
|
classes.union combinators compiler.units definitions effects
|
|
effects.parser generic generic.hook generic.math generic.parser
|
|
generic.standard hash-sets hashtables io.pathnames kernel lexer
|
|
math namespaces parser quotations sbufs sequences slots
|
|
source-files splitting strings strings.parser
|
|
strings.parser.private vectors vocabs vocabs.parser words
|
|
words.alias words.constant words.symbol ;
|
|
IN: bootstrap.syntax
|
|
|
|
! These words are defined as a top-level form, instead of with
|
|
! defining parsing words, because during stage1 bootstrap, the
|
|
! "syntax" vocabulary is copied from the host. When stage1
|
|
! bootstrap completes, the host's syntax vocabulary is deleted
|
|
! from the target, then this top-level form creates the
|
|
! target's "syntax" vocabulary as one of the first things done
|
|
! in stage2.
|
|
|
|
: define-delimiter ( name -- )
|
|
"syntax" lookup-word t "delimiter" set-word-prop ;
|
|
|
|
! Keep track of words defined by SYNTAX: as opposed to words
|
|
! merely generated by define-syntax.
|
|
: mark-top-level-syntax ( word -- word )
|
|
dup t "syntax" set-word-prop ;
|
|
|
|
: define-core-syntax ( name quot -- )
|
|
[
|
|
dup "syntax" lookup-word [ ] [ no-word-error ] ?if
|
|
mark-top-level-syntax
|
|
] dip
|
|
define-syntax ;
|
|
|
|
[
|
|
{ "]" "}" ";" ">>" } [ define-delimiter ] each
|
|
|
|
"PRIMITIVE:" [
|
|
current-vocab name>>
|
|
scan-word scan-effect ensure-primitive
|
|
] define-core-syntax
|
|
|
|
"CS{" [
|
|
"Call stack literals are not supported" throw
|
|
] define-core-syntax
|
|
|
|
"IN:" [ scan-token set-current-vocab ] define-core-syntax
|
|
|
|
"<PRIVATE" [ begin-private ] define-core-syntax
|
|
|
|
"PRIVATE>" [ end-private ] define-core-syntax
|
|
|
|
"USE:" [ scan-token use-vocab ] define-core-syntax
|
|
|
|
"UNUSE:" [ scan-token unuse-vocab ] define-core-syntax
|
|
|
|
"USING:" [ ";" [ use-vocab ] each-token ] define-core-syntax
|
|
|
|
"QUALIFIED:" [ scan-token dup add-qualified ] define-core-syntax
|
|
|
|
"QUALIFIED-WITH:" [ scan-token scan-token add-qualified ] define-core-syntax
|
|
|
|
"FROM:" [
|
|
scan-token "=>" expect ";" parse-tokens add-words-from
|
|
] define-core-syntax
|
|
|
|
"EXCLUDE:" [
|
|
scan-token "=>" expect ";" parse-tokens add-words-excluding
|
|
] define-core-syntax
|
|
|
|
"RENAME:" [
|
|
scan-token scan-token "=>" expect scan-token add-renamed-word
|
|
] define-core-syntax
|
|
|
|
"NAN:" [ 16 scan-base <fp-nan> suffix! ] define-core-syntax
|
|
|
|
"f" [ f suffix! ] define-core-syntax
|
|
|
|
"CHAR:" [
|
|
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 ) ]
|
|
} cond suffix!
|
|
] define-core-syntax
|
|
|
|
"\"" [ parse-string suffix! ] define-core-syntax
|
|
|
|
"SBUF\"" [
|
|
lexer get skip-blank parse-string >sbuf suffix!
|
|
] define-core-syntax
|
|
|
|
"P\"" [
|
|
lexer get skip-blank parse-string <pathname> suffix!
|
|
] define-core-syntax
|
|
|
|
"[" [ parse-quotation suffix! ] define-core-syntax
|
|
"{" [ \ } [ >array ] parse-literal ] define-core-syntax
|
|
"V{" [ \ } [ >vector ] parse-literal ] define-core-syntax
|
|
"B{" [ \ } [ >byte-array ] parse-literal ] define-core-syntax
|
|
"BV{" [ \ } [ >byte-vector ] parse-literal ] define-core-syntax
|
|
"H{" [ \ } [ parse-hashtable ] parse-literal ] define-core-syntax
|
|
"T{" [ parse-tuple-literal suffix! ] define-core-syntax
|
|
"W{" [ \ } [ first <wrapper> ] parse-literal ] define-core-syntax
|
|
"HS{" [ \ } [ >hash-set ] parse-literal ] define-core-syntax
|
|
|
|
"POSTPONE:" [ scan-word suffix! ] define-core-syntax
|
|
"\\" [ scan-word <wrapper> suffix! ] define-core-syntax
|
|
"M\\" [ scan-word scan-word lookup-method <wrapper> suffix! ] define-core-syntax
|
|
"inline" [ last-word make-inline ] define-core-syntax
|
|
"recursive" [ last-word make-recursive ] define-core-syntax
|
|
"foldable" [ last-word make-foldable ] define-core-syntax
|
|
"flushable" [ last-word make-flushable ] define-core-syntax
|
|
"delimiter" [ last-word t "delimiter" set-word-prop ] define-core-syntax
|
|
"deprecated" [ last-word make-deprecated ] define-core-syntax
|
|
|
|
"SYNTAX:" [
|
|
scan-new-word
|
|
mark-top-level-syntax
|
|
parse-definition define-syntax
|
|
] define-core-syntax
|
|
|
|
"BUILTIN:" [
|
|
scan-word-name
|
|
current-vocab lookup-word
|
|
(parse-tuple-definition)
|
|
2drop builtin-class check-instance drop
|
|
] define-core-syntax
|
|
|
|
"SYMBOL:" [
|
|
scan-new-word define-symbol
|
|
] define-core-syntax
|
|
|
|
"SYMBOLS:" [
|
|
";" [ create-word-in [ reset-generic ] [ define-symbol ] bi ] each-token
|
|
] define-core-syntax
|
|
|
|
"SINGLETONS:" [
|
|
";" [ create-class-in define-singleton-class ] each-token
|
|
] define-core-syntax
|
|
|
|
"DEFER:" [
|
|
scan-token current-vocab create-word
|
|
[ fake-definition ] [ set-last-word ] [ undefined-def define ] tri
|
|
] define-core-syntax
|
|
|
|
"ALIAS:" [
|
|
scan-new-word scan-word define-alias
|
|
] define-core-syntax
|
|
|
|
"CONSTANT:" [
|
|
scan-new-word scan-object define-constant
|
|
] define-core-syntax
|
|
|
|
":" [
|
|
(:) define-declared
|
|
] define-core-syntax
|
|
|
|
"GENERIC:" [
|
|
[ simple-combination ] (GENERIC:)
|
|
] define-core-syntax
|
|
|
|
"GENERIC#:" [
|
|
[ scan-number <standard-combination> ] (GENERIC:)
|
|
] define-core-syntax
|
|
|
|
"MATH:" [
|
|
[ math-combination ] (GENERIC:)
|
|
] define-core-syntax
|
|
|
|
"HOOK:" [
|
|
[ scan-word <hook-combination> ] (GENERIC:)
|
|
] define-core-syntax
|
|
|
|
"M:" [
|
|
(M:) define
|
|
] define-core-syntax
|
|
|
|
"UNION:" [
|
|
scan-new-class parse-array-def define-union-class
|
|
] define-core-syntax
|
|
|
|
"INTERSECTION:" [
|
|
scan-new-class parse-array-def define-intersection-class
|
|
] define-core-syntax
|
|
|
|
"MIXIN:" [
|
|
scan-new-class define-mixin-class
|
|
] define-core-syntax
|
|
|
|
"INSTANCE:" [
|
|
location [
|
|
scan-word scan-word 2dup add-mixin-instance
|
|
<mixin-instance>
|
|
] dip remember-definition
|
|
] define-core-syntax
|
|
|
|
"PREDICATE:" [
|
|
scan-new-class
|
|
"<" expect
|
|
scan-class
|
|
parse-definition define-predicate-class
|
|
] define-core-syntax
|
|
|
|
"SINGLETON:" [
|
|
scan-new-class define-singleton-class
|
|
] define-core-syntax
|
|
|
|
"TUPLE:" [
|
|
parse-tuple-definition define-tuple-class
|
|
] define-core-syntax
|
|
|
|
"final" [
|
|
last-word make-final
|
|
] define-core-syntax
|
|
|
|
"SLOT:" [
|
|
scan-token define-protocol-slot
|
|
] define-core-syntax
|
|
|
|
"C:" [
|
|
scan-new-word scan-word define-boa-word
|
|
] define-core-syntax
|
|
|
|
"ERROR:" [
|
|
parse-tuple-definition
|
|
pick save-location
|
|
define-error-class
|
|
] define-core-syntax
|
|
|
|
"FORGET:" [
|
|
scan-object forget
|
|
] define-core-syntax
|
|
|
|
"(" [
|
|
")" parse-effect suffix!
|
|
] define-core-syntax
|
|
|
|
"MAIN:" [
|
|
scan-word dup \ [ = [
|
|
drop "( main )" <uninterned-word> dup
|
|
parse-quotation ( -- ) define-declared
|
|
] when dup ( -- ) check-stack-effect
|
|
[ current-vocab main<< ]
|
|
[ current-source-file get [ main<< ] [ drop ] if* ] bi
|
|
] define-core-syntax
|
|
|
|
"<<" [
|
|
[
|
|
\ >> parse-until >quotation
|
|
] with-nested-compilation-unit call( -- )
|
|
] define-core-syntax
|
|
|
|
"call-next-method" [
|
|
current-method get [
|
|
literalize suffix!
|
|
\ (call-next-method) suffix!
|
|
] [
|
|
not-in-a-method-error
|
|
] if*
|
|
] define-core-syntax
|
|
|
|
"maybe{" [
|
|
\ } [ <anonymous-union> <maybe> ] parse-literal
|
|
] define-core-syntax
|
|
|
|
"not{" [
|
|
\ } [ <anonymous-union> <anonymous-complement> ] parse-literal
|
|
] define-core-syntax
|
|
|
|
"intersection{" [
|
|
\ } [ <anonymous-intersection> ] parse-literal
|
|
] define-core-syntax
|
|
|
|
"union{" [
|
|
\ } [ <anonymous-union> ] parse-literal
|
|
] define-core-syntax
|
|
|
|
"initial:" "syntax" lookup-word define-symbol
|
|
|
|
"read-only" "syntax" lookup-word define-symbol
|
|
|
|
"call(" [ \ call-effect parse-call-paren ] define-core-syntax
|
|
|
|
"execute(" [ \ execute-effect parse-call-paren ] define-core-syntax
|
|
|
|
"<<<<<<<" [ version-control-merge-conflict ] define-core-syntax
|
|
"=======" [ version-control-merge-conflict ] define-core-syntax
|
|
">>>>>>>" [ version-control-merge-conflict ] define-core-syntax
|
|
|
|
"<<<<<<" [ version-control-merge-conflict ] define-core-syntax
|
|
"======" [ version-control-merge-conflict ] define-core-syntax
|
|
">>>>>>" [ version-control-merge-conflict ] define-core-syntax
|
|
] with-compilation-unit
|