factor/core/syntax/syntax.factor

253 lines
6.9 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.
2008-12-08 15:58:00 -05:00
USING: accessors alien arrays byte-arrays definitions generic
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
generic.standard 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
"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
"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 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