2010-03-26 03:42:07 -04:00
|
|
|
! Copyright (C) 2004, 2010 Slava Pestov.
|
2007-09-20 18:09:08 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2013-03-05 13:34:47 -05:00
|
|
|
USING: accessors arrays byte-arrays byte-vectors
|
2013-03-10 15:04:34 -04:00
|
|
|
classes.algebra.private classes.builtin classes.intersection
|
|
|
|
classes.maybe classes.mixin classes.parser classes.predicate
|
2013-03-05 13:34:47 -05:00
|
|
|
classes.singleton classes.tuple classes.tuple.parser
|
|
|
|
classes.union combinators compiler.units definitions
|
|
|
|
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 vectors
|
|
|
|
vocabs.parser words words.alias words.constant words.symbol ;
|
2007-09-20 18:09:08 -04:00
|
|
|
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 -- )
|
2011-11-06 18:57:24 -05:00
|
|
|
"syntax" lookup-word t "delimiter" set-word-prop ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
: define-core-syntax ( name quot -- )
|
2011-11-06 18:57:24 -05:00
|
|
|
[ dup "syntax" lookup-word [ ] [ no-word-error ] ?if ] dip
|
2009-03-21 02:27:50 -04:00
|
|
|
define-syntax ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2007-12-21 21:18:24 -05:00
|
|
|
[
|
|
|
|
{ "]" "}" ";" ">>" } [ define-delimiter ] each
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2007-12-21 21:18:24 -05:00
|
|
|
"PRIMITIVE:" [
|
2011-10-31 03:18:45 -04:00
|
|
|
"Primitive definition is not supported" throw
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
|
|
|
"CS{" [
|
|
|
|
"Call stack literals are not supported" throw
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
"!" [ lexer get next-line ] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
"#!" [ POSTPONE: ! ] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2010-07-06 16:20:08 -04:00
|
|
|
"IN:" [ scan-token set-current-vocab ] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2009-05-14 23:31:29 -04:00
|
|
|
"<PRIVATE" [ begin-private ] define-core-syntax
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-05-14 23:31:29 -04:00
|
|
|
"PRIVATE>" [ end-private ] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2010-07-06 16:20:08 -04:00
|
|
|
"USE:" [ scan-token use-vocab ] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2010-07-06 16:20:08 -04:00
|
|
|
"UNUSE:" [ scan-token unuse-vocab ] define-core-syntax
|
2009-05-16 01:29:21 -04:00
|
|
|
|
2010-03-01 01:06:47 -05:00
|
|
|
"USING:" [ ";" [ use-vocab ] each-token ] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2010-07-06 16:20:08 -04:00
|
|
|
"QUALIFIED:" [ scan-token dup add-qualified ] define-core-syntax
|
2008-12-17 19:10:01 -05:00
|
|
|
|
2010-07-06 16:20:08 -04:00
|
|
|
"QUALIFIED-WITH:" [ scan-token scan-token add-qualified ] define-core-syntax
|
2008-12-17 19:10:01 -05:00
|
|
|
|
|
|
|
"FROM:" [
|
2010-07-06 16:20:08 -04:00
|
|
|
scan-token "=>" expect ";" parse-tokens add-words-from
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2008-12-17 19:10:01 -05:00
|
|
|
|
|
|
|
"EXCLUDE:" [
|
2010-07-06 16:20:08 -04:00
|
|
|
scan-token "=>" expect ";" parse-tokens add-words-excluding
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2008-12-17 19:10:01 -05:00
|
|
|
|
|
|
|
"RENAME:" [
|
2010-07-06 16:20:08 -04:00
|
|
|
scan-token scan-token "=>" expect scan-token add-renamed-word
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2008-12-17 19:10:01 -05:00
|
|
|
|
2009-10-28 14:38:27 -04:00
|
|
|
"NAN:" [ 16 scan-base <fp-nan> suffix! ] define-core-syntax
|
2009-09-12 16:06:15 -04:00
|
|
|
|
2009-10-28 14:38:27 -04:00
|
|
|
"f" [ f suffix! ] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2008-02-15 20:32:14 -05:00
|
|
|
"CHAR:" [
|
2010-07-06 16:20:08 -04:00
|
|
|
scan-token {
|
2008-02-15 20:32:14 -05:00
|
|
|
{ [ dup length 1 = ] [ first ] }
|
2008-11-23 01:25:01 -05:00
|
|
|
{ [ "\\" ?head ] [ next-escape >string "" assert= ] }
|
2009-03-17 03:19:50 -04:00
|
|
|
[ name>char-hook get call( name -- char ) ]
|
2009-10-28 14:38:27 -04:00
|
|
|
} cond suffix!
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2008-02-15 20:32:14 -05:00
|
|
|
|
2009-10-28 14:38:27 -04:00
|
|
|
"\"" [ parse-multiline-string suffix! ] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
|
|
|
"SBUF\"" [
|
2009-10-28 14:38:27 -04:00
|
|
|
lexer get skip-blank parse-string >sbuf suffix!
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
|
|
|
"P\"" [
|
2009-10-28 14:38:27 -04:00
|
|
|
lexer get skip-blank parse-string <pathname> suffix!
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
|
|
|
|
2009-10-28 14:38:27 -04:00
|
|
|
"[" [ parse-quotation suffix! ] define-core-syntax
|
2009-03-21 02:27:50 -04:00
|
|
|
"{" [ \ } [ >array ] parse-literal ] define-core-syntax
|
|
|
|
"V{" [ \ } [ >vector ] parse-literal ] define-core-syntax
|
|
|
|
"B{" [ \ } [ >byte-array ] parse-literal ] define-core-syntax
|
2009-05-02 14:45:38 -04:00
|
|
|
"BV{" [ \ } [ >byte-vector ] parse-literal ] define-core-syntax
|
2012-08-24 18:00:33 -04:00
|
|
|
"H{" [ \ } [ parse-hashtable ] parse-literal ] define-core-syntax
|
2009-10-28 14:38:27 -04:00
|
|
|
"T{" [ parse-tuple-literal suffix! ] define-core-syntax
|
2009-03-21 02:27:50 -04:00
|
|
|
"W{" [ \ } [ first <wrapper> ] parse-literal ] define-core-syntax
|
2011-10-19 14:35:25 -04:00
|
|
|
"HS{" [ \ } [ >hash-set ] parse-literal ] define-core-syntax
|
2009-03-21 02:27:50 -04:00
|
|
|
|
2009-10-28 14:38:27 -04:00
|
|
|
"POSTPONE:" [ scan-word suffix! ] define-core-syntax
|
|
|
|
"\\" [ scan-word <wrapper> suffix! ] define-core-syntax
|
2011-10-03 18:49:49 -04:00
|
|
|
"M\\" [ scan-word scan-word lookup-method <wrapper> suffix! ] define-core-syntax
|
2013-03-23 19:05:14 -04:00
|
|
|
"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
|
2009-03-21 02:27:50 -04:00
|
|
|
|
|
|
|
"SYNTAX:" [
|
2011-09-27 16:20:07 -04:00
|
|
|
scan-new-word parse-definition define-syntax
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2013-03-10 15:04:34 -04:00
|
|
|
"BUILTIN:" [
|
|
|
|
scan-word-name
|
|
|
|
current-vocab lookup-word
|
|
|
|
(parse-tuple-definition) 2drop check-builtin
|
|
|
|
] define-core-syntax
|
|
|
|
|
2007-12-21 21:18:24 -05:00
|
|
|
"SYMBOL:" [
|
2011-09-27 16:20:07 -04:00
|
|
|
scan-new-word define-symbol
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2008-12-17 19:10:01 -05:00
|
|
|
"SYMBOLS:" [
|
2010-03-26 03:42:07 -04:00
|
|
|
";" [ create-in [ reset-generic ] [ define-symbol ] bi ] each-token
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2008-12-17 19:10:01 -05:00
|
|
|
|
|
|
|
"SINGLETONS:" [
|
2010-03-01 01:06:47 -05:00
|
|
|
";" [ create-class-in define-singleton-class ] each-token
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2009-03-22 19:00:26 -04:00
|
|
|
|
|
|
|
"DEFER:" [
|
2010-07-06 16:20:08 -04:00
|
|
|
scan-token current-vocab create
|
2013-03-23 19:05:14 -04:00
|
|
|
[ fake-definition ] [ set-last-word ] [ undefined-def define ] tri
|
2009-03-22 19:00:26 -04:00
|
|
|
] define-core-syntax
|
2014-06-03 21:04:51 -04:00
|
|
|
|
2008-12-17 19:10:01 -05:00
|
|
|
"ALIAS:" [
|
2011-09-27 16:20:07 -04:00
|
|
|
scan-new-word scan-word define-alias
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2008-12-17 19:10:01 -05:00
|
|
|
|
|
|
|
"CONSTANT:" [
|
2011-09-27 16:20:07 -04:00
|
|
|
scan-new-word scan-object define-constant
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2008-12-17 19:10:01 -05:00
|
|
|
|
2007-12-21 21:18:24 -05:00
|
|
|
":" [
|
2009-03-21 04:17:35 -04:00
|
|
|
(:) define-declared
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
|
|
|
"GENERIC:" [
|
2009-03-22 19:00:26 -04:00
|
|
|
[ simple-combination ] (GENERIC:)
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
|
|
|
"GENERIC#" [
|
2011-10-01 19:42:37 -04:00
|
|
|
[ scan-number <standard-combination> ] (GENERIC:)
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
|
|
|
"MATH:" [
|
2009-03-22 19:00:26 -04:00
|
|
|
[ math-combination ] (GENERIC:)
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
|
|
|
"HOOK:" [
|
2009-03-22 19:00:26 -04:00
|
|
|
[ scan-word <hook-combination> ] (GENERIC:)
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
|
|
|
"M:" [
|
2008-03-16 03:43:00 -04:00
|
|
|
(M:) define
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
|
|
|
"UNION:" [
|
2011-09-27 16:20:07 -04:00
|
|
|
scan-new-class parse-definition define-union-class
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2008-05-10 19:09:05 -04:00
|
|
|
"INTERSECTION:" [
|
2011-09-27 16:20:07 -04:00
|
|
|
scan-new-class parse-definition define-intersection-class
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2008-05-10 19:09:05 -04:00
|
|
|
|
2007-12-21 21:18:24 -05:00
|
|
|
"MIXIN:" [
|
2011-09-27 16:20:07 -04:00
|
|
|
scan-new-class define-mixin-class
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2008-01-04 21:10:49 -05:00
|
|
|
"INSTANCE:" [
|
2008-11-23 03:44:56 -05:00
|
|
|
location [
|
|
|
|
scan-word scan-word 2dup add-mixin-instance
|
|
|
|
<mixin-instance>
|
|
|
|
] dip remember-definition
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
|
|
|
"PREDICATE:" [
|
2011-09-27 16:20:07 -04:00
|
|
|
scan-new-class
|
2010-07-06 16:20:08 -04:00
|
|
|
"<" expect
|
2011-11-22 02:00:52 -05:00
|
|
|
scan-class
|
2007-12-21 21:18:24 -05:00
|
|
|
parse-definition define-predicate-class
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2008-04-02 14:11:55 -04:00
|
|
|
"SINGLETON:" [
|
2011-09-27 16:20:07 -04:00
|
|
|
scan-new-class define-singleton-class
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2008-04-02 14:11:55 -04:00
|
|
|
|
2007-12-21 21:18:24 -05:00
|
|
|
"TUPLE:" [
|
2008-03-26 18:07:50 -04:00
|
|
|
parse-tuple-definition define-tuple-class
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2010-02-17 08:19:57 -05:00
|
|
|
"final" [
|
2013-03-23 19:05:14 -04:00
|
|
|
last-word make-final
|
2010-02-17 08:19:57 -05:00
|
|
|
] define-core-syntax
|
|
|
|
|
2008-06-28 03:36:20 -04:00
|
|
|
"SLOT:" [
|
2010-07-06 16:20:08 -04:00
|
|
|
scan-token define-protocol-slot
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2008-06-28 03:36:20 -04:00
|
|
|
|
2007-12-21 21:18:24 -05:00
|
|
|
"C:" [
|
2011-09-27 16:20:07 -04:00
|
|
|
scan-new-word scan-word define-boa-word
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2008-03-19 20:15:43 -04:00
|
|
|
"ERROR:" [
|
2008-03-26 18:07:50 -04:00
|
|
|
parse-tuple-definition
|
|
|
|
pick save-location
|
|
|
|
define-error-class
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2008-03-19 20:15:43 -04:00
|
|
|
|
2008-01-09 16:57:59 -05:00
|
|
|
"FORGET:" [
|
2008-03-27 20:52:53 -04:00
|
|
|
scan-object forget
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2009-03-22 19:00:26 -04:00
|
|
|
"(" [
|
2011-10-18 16:18:42 -04:00
|
|
|
")" parse-effect suffix!
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2008-06-08 16:32:55 -04:00
|
|
|
|
2011-08-17 23:58:09 -04:00
|
|
|
"MAIN:" [
|
|
|
|
scan-word
|
|
|
|
[ current-vocab main<< ]
|
|
|
|
[ file get [ main<< ] [ drop ] if* ] bi
|
|
|
|
] define-core-syntax
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2008-01-15 22:35:03 -05:00
|
|
|
"<<" [
|
2008-05-28 20:34:18 -04:00
|
|
|
[
|
|
|
|
\ >> parse-until >quotation
|
2009-03-17 03:19:50 -04:00
|
|
|
] with-nested-compilation-unit call( -- )
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2008-04-02 22:27:49 -04:00
|
|
|
|
|
|
|
"call-next-method" [
|
2008-11-22 20:57:25 -05:00
|
|
|
current-method get [
|
2009-10-28 14:38:27 -04:00
|
|
|
literalize suffix!
|
|
|
|
\ (call-next-method) suffix!
|
2008-04-26 19:55:26 -04:00
|
|
|
] [
|
|
|
|
not-in-a-method-error
|
2008-11-22 20:57:25 -05:00
|
|
|
] if*
|
2009-03-21 02:27:50 -04:00
|
|
|
] define-core-syntax
|
2011-11-22 02:00:52 -05:00
|
|
|
|
2012-05-03 22:17:41 -04:00
|
|
|
"maybe{" [
|
|
|
|
\ } [ <anonymous-union> <maybe> ] parse-literal
|
|
|
|
] define-core-syntax
|
|
|
|
|
|
|
|
"not{" [
|
|
|
|
\ } [ <anonymous-union> <anonymous-complement> ] parse-literal
|
2011-11-22 02:00:52 -05:00
|
|
|
] define-core-syntax
|
2011-11-22 21:49:18 -05:00
|
|
|
|
|
|
|
"intersection{" [
|
|
|
|
\ } [ <anonymous-intersection> ] parse-literal
|
|
|
|
] define-core-syntax
|
|
|
|
|
|
|
|
"union{" [
|
|
|
|
\ } [ <anonymous-union> ] parse-literal
|
|
|
|
] define-core-syntax
|
|
|
|
|
2011-11-06 18:57:24 -05:00
|
|
|
"initial:" "syntax" lookup-word define-symbol
|
2009-06-11 20:48:14 -04:00
|
|
|
|
2011-11-06 18:57:24 -05:00
|
|
|
"read-only" "syntax" lookup-word define-symbol
|
2009-03-16 21:11:36 -04:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
"call(" [ \ call-effect parse-call( ] define-core-syntax
|
2009-03-16 21:11:36 -04:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
"execute(" [ \ execute-effect parse-call( ] define-core-syntax
|
2010-04-06 16:34:26 -04:00
|
|
|
|
|
|
|
"<<<<<<<" [ 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
|
2007-12-21 21:18:24 -05:00
|
|
|
] with-compilation-unit
|