factor/core/syntax/syntax.factor

255 lines
7.1 KiB
Factor
Raw Normal View History

2009-03-16 21:11:36 -04:00
! Copyright (C) 2004, 2009 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien arrays byte-arrays byte-vectors definitions generic
2008-12-08 15:58:00 -05:00
hashtables kernel math namespaces parser lexer sequences strings
strings.parser sbufs vectors words words.symbol words.constant
words.alias quotations io assocs splitting classes.tuple
2009-04-24 21:43:01 -04:00
generic.standard generic.hook generic.math generic.parser classes
io.pathnames vocabs vocabs.parser classes.parser classes.union
classes.intersection classes.mixin classes.predicate
classes.singleton classes.tuple.parser compiler.units
combinators effects.parser slots ;
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 -- )
"syntax" lookup t "delimiter" set-word-prop ;
: define-core-syntax ( name quot -- )
[ dup "syntax" lookup [ ] [ no-word-error ] ?if ] dip
define-syntax ;
2007-09-20 18:09:08 -04:00
[
{ "]" "}" ";" ">>" } [ define-delimiter ] each
2007-09-20 18:09:08 -04:00
"PRIMITIVE:" [
"Primitive definition is not supported" throw
] define-core-syntax
"CS{" [
"Call stack literals are not supported" throw
] define-core-syntax
"!" [ lexer get next-line ] define-core-syntax
"#!" [ POSTPONE: ! ] define-core-syntax
"IN:" [ scan set-in ] define-core-syntax
"PRIVATE>" [ in get ".private" ?tail drop set-in ] define-core-syntax
2007-09-20 18:09:08 -04:00
"<PRIVATE" [
POSTPONE: PRIVATE> in get ".private" append set-in
] define-core-syntax
"USE:" [ scan use+ ] define-core-syntax
"USING:" [ ";" parse-tokens add-use ] define-core-syntax
"QUALIFIED:" [ scan dup add-qualified ] define-core-syntax
"QUALIFIED-WITH:" [ scan scan add-qualified ] define-core-syntax
"FROM:" [
scan "=>" expect ";" parse-tokens swap add-words-from
] define-core-syntax
"EXCLUDE:" [
scan "=>" expect ";" parse-tokens swap add-words-excluding
] define-core-syntax
"RENAME:" [
scan scan "=>" expect scan add-renamed-word
] define-core-syntax
"HEX:" [ 16 parse-base ] define-core-syntax
"OCT:" [ 8 parse-base ] define-core-syntax
"BIN:" [ 2 parse-base ] define-core-syntax
"f" [ f parsed ] define-core-syntax
2008-04-02 17:32:10 -04:00
"t" "syntax" lookup define-singleton-class
2008-02-15 20:32:14 -05:00
"CHAR:" [
scan {
{ [ 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 ) ]
2008-02-15 20:32:14 -05:00
} cond parsed
] define-core-syntax
2008-02-15 20:32:14 -05:00
"\"" [ parse-string parsed ] define-core-syntax
"SBUF\"" [
lexer get skip-blank parse-string >sbuf parsed
] define-core-syntax
"P\"" [
lexer get skip-blank parse-string <pathname> parsed
] define-core-syntax
"[" [ parse-quotation parsed ] 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{" [ \ } [ >hashtable ] parse-literal ] define-core-syntax
"T{" [ parse-tuple-literal parsed ] define-core-syntax
"W{" [ \ } [ first <wrapper> ] parse-literal ] define-core-syntax
"POSTPONE:" [ scan-word parsed ] define-core-syntax
"\\" [ scan-word <wrapper> parsed ] define-core-syntax
2009-04-06 03:57:39 -04:00
"M\\" [ scan-word scan-word method <wrapper> parsed ] define-core-syntax
"inline" [ word make-inline ] define-core-syntax
"recursive" [ word make-recursive ] define-core-syntax
"foldable" [ word make-foldable ] define-core-syntax
"flushable" [ word make-flushable ] define-core-syntax
"delimiter" [ word t "delimiter" set-word-prop ] define-core-syntax
"SYNTAX:" [
CREATE-WORD parse-definition define-syntax
] define-core-syntax
"SYMBOL:" [
2008-03-16 03:43:00 -04:00
CREATE-WORD define-symbol
] define-core-syntax
"SYMBOLS:" [
";" parse-tokens
[ create-in dup reset-generic define-symbol ] each
] define-core-syntax
"SINGLETONS:" [
";" parse-tokens
[ create-class-in define-singleton-class ] each
] define-core-syntax
"DEFER:" [
scan current-vocab create
[ fake-definition ] [ set-word ] [ [ undefined ] define ] tri
] define-core-syntax
"ALIAS:" [
CREATE-WORD scan-word define-alias
] define-core-syntax
"CONSTANT:" [
CREATE-WORD scan-object define-constant
] define-core-syntax
":" [
(:) define-declared
] define-core-syntax
"GENERIC:" [
[ simple-combination ] (GENERIC:)
] define-core-syntax
"GENERIC#" [
[ scan-word <standard-combination> ] (GENERIC:)
] define-core-syntax
"MATH:" [
[ math-combination ] (GENERIC:)
] define-core-syntax
"HOOK:" [
[ scan-word <hook-combination> ] (GENERIC:)
] define-core-syntax
"M:" [
2008-03-16 03:43:00 -04:00
(M:) define
] define-core-syntax
"UNION:" [
CREATE-CLASS parse-definition define-union-class
] define-core-syntax
2008-05-10 19:09:05 -04:00
"INTERSECTION:" [
CREATE-CLASS parse-definition define-intersection-class
] define-core-syntax
2008-05-10 19:09:05 -04:00
"MIXIN:" [
CREATE-CLASS define-mixin-class
] define-core-syntax
2008-01-04 21:10:49 -05:00
"INSTANCE:" [
location [
scan-word scan-word 2dup add-mixin-instance
<mixin-instance>
] dip remember-definition
] define-core-syntax
"PREDICATE:" [
CREATE-CLASS
2008-03-26 19:23:19 -04:00
scan "<" assert=
scan-word
parse-definition define-predicate-class
] define-core-syntax
2008-04-02 14:11:55 -04:00
"SINGLETON:" [
2008-05-10 19:20:50 -04:00
CREATE-CLASS define-singleton-class
] define-core-syntax
2008-04-02 14:11:55 -04:00
"TUPLE:" [
2008-03-26 18:07:50 -04:00
parse-tuple-definition define-tuple-class
] define-core-syntax
"SLOT:" [
scan define-protocol-slot
] define-core-syntax
"C:" [
CREATE-WORD scan-word define-boa-word
] define-core-syntax
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
] 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
] define-core-syntax
"(" [
")" parse-effect drop
] define-core-syntax
2008-06-08 16:32:55 -04:00
"((" [
"))" parse-effect parsed
] define-core-syntax
2008-06-08 16:32:55 -04:00
"MAIN:" [ scan-word in get vocab (>>main) ] define-core-syntax
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( -- )
] define-core-syntax
"call-next-method" [
current-method get [
literalize parsed
2008-04-26 19:55:26 -04:00
\ (call-next-method) parsed
] [
not-in-a-method-error
] if*
] define-core-syntax
"initial:" "syntax" lookup define-symbol
2008-06-30 02:44:58 -04:00
"read-only" "syntax" lookup define-symbol
2009-03-16 21:11:36 -04:00
"call(" [ \ call-effect parse-call( ] define-core-syntax
2009-03-16 21:11:36 -04:00
"execute(" [ \ execute-effect parse-call( ] define-core-syntax
] with-compilation-unit