2017-09-03 13:13:06 -04:00
|
|
|
! Copyright (C) 2017 Doug Coleman.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2017-09-30 09:52:03 -04:00
|
|
|
USING: accessors arrays assocs combinators
|
|
|
|
combinators.short-circuit constructors fry kernel lexer modern
|
2017-09-30 15:14:23 -04:00
|
|
|
namespaces sequences sets splitting strings ;
|
2017-09-03 13:13:06 -04:00
|
|
|
IN: modern.compiler
|
|
|
|
|
|
|
|
<<
|
|
|
|
SYMBOL: left-decorators
|
|
|
|
left-decorators [ HS{ } clone ] initialize
|
|
|
|
>>
|
|
|
|
<<
|
|
|
|
: make-left-decorator ( string -- )
|
|
|
|
left-decorators get adjoin ;
|
|
|
|
|
|
|
|
>>
|
|
|
|
<<
|
|
|
|
SYNTAX: \LEFT-DECORATOR: scan-token make-left-decorator ;
|
|
|
|
>>
|
|
|
|
|
|
|
|
LEFT-DECORATOR: delimiter
|
|
|
|
LEFT-DECORATOR: deprecated
|
|
|
|
LEFT-DECORATOR: final
|
|
|
|
LEFT-DECORATOR: flushable
|
|
|
|
LEFT-DECORATOR: foldable
|
|
|
|
LEFT-DECORATOR: inline
|
|
|
|
LEFT-DECORATOR: recursive
|
|
|
|
|
|
|
|
: left-decorator? ( obj -- ? )
|
|
|
|
left-decorators get in? ;
|
|
|
|
|
|
|
|
<<
|
|
|
|
SYMBOL: arities
|
|
|
|
arities [ H{ } clone ] initialize
|
|
|
|
>>
|
|
|
|
<<
|
|
|
|
: make-arity ( n string -- )
|
|
|
|
arities get set-at ;
|
|
|
|
>>
|
|
|
|
<<
|
|
|
|
SYNTAX: \ARITY: scan-token scan-token swap make-arity ;
|
|
|
|
>>
|
|
|
|
|
|
|
|
ARITY: \ALIAS: 2
|
|
|
|
ARITY: \ARITY: 2
|
|
|
|
ARITY: \BUILTIN: 1
|
|
|
|
ARITY: \CONSTANT: 2
|
|
|
|
ARITY: \DEFER: 1
|
|
|
|
ARITY: \GENERIC#: 3
|
|
|
|
ARITY: \GENERIC: 2
|
|
|
|
ARITY: \HOOK: 3
|
|
|
|
ARITY: \IN: 1
|
|
|
|
ARITY: \INSTANCE: 2
|
|
|
|
ARITY: \MAIN: 1
|
|
|
|
ARITY: \MATH: 1
|
|
|
|
ARITY: \MIXIN: 1
|
|
|
|
ARITY: \PRIMITIVE: 2
|
|
|
|
ARITY: \QUALIFIED-WITH: 2
|
|
|
|
ARITY: \QUALIFIED: 1
|
|
|
|
ARITY: \RENAME: 3
|
|
|
|
ARITY: \SINGLETON: 1
|
|
|
|
ARITY: \SLOT: 1
|
|
|
|
ARITY: \SYMBOL: 1
|
|
|
|
ARITY: \UNUSE: 1
|
|
|
|
ARITY: \USE: 1
|
2017-09-24 23:22:40 -04:00
|
|
|
! ARITY: \USING: 0
|
2017-09-03 13:13:06 -04:00
|
|
|
|
|
|
|
: get-arity ( string -- n/f )
|
|
|
|
arities get at ;
|
|
|
|
|
|
|
|
<<
|
|
|
|
SYMBOL: variable-arities
|
|
|
|
variable-arities [ H{ } clone ] initialize
|
|
|
|
>>
|
|
|
|
<<
|
|
|
|
: make-variable-arity ( n string -- )
|
|
|
|
variable-arities get set-at ;
|
|
|
|
>>
|
|
|
|
<<
|
|
|
|
SYNTAX: \VARIABLE-ARITY: scan-token scan-token swap make-arity ;
|
|
|
|
>>
|
|
|
|
|
|
|
|
VARIABLE-ARITY: \EXCLUDE: 2
|
|
|
|
VARIABLE-ARITY: \FROM: 2
|
|
|
|
VARIABLE-ARITY: \INTERSECTION: 1
|
|
|
|
VARIABLE-ARITY: \PREDICATE: 3
|
|
|
|
VARIABLE-ARITY: \SYNTAX: 1
|
|
|
|
VARIABLE-ARITY: \TUPLE: 1
|
|
|
|
VARIABLE-ARITY: \UNION: 1
|
|
|
|
VARIABLE-ARITY: \WORD: 2
|
|
|
|
|
|
|
|
VARIABLE-ARITY: \<CLASS: 3
|
|
|
|
VARIABLE-ARITY: \<FUNCTOR: 2
|
2017-09-30 09:52:03 -04:00
|
|
|
|
|
|
|
|
|
|
|
TUPLE: vocabulary-root uri path ;
|
|
|
|
CONSTRUCTOR: <vocabulary-root> vocabulary-root ( uri path -- obj ) ;
|
|
|
|
|
|
|
|
TUPLE: vocabulary name words main ;
|
|
|
|
CONSTRUCTOR: <vocabulary> vocabulary ( name -- obj )
|
|
|
|
H{ } clone >>words ;
|
|
|
|
|
|
|
|
CONSTANT: core-root T{ vocabulary-root f "git@github.com:factor/factor" "core/" }
|
|
|
|
CONSTANT: basis-root T{ vocabulary-root f "git@github.com:factor/factor" "basis/" }
|
|
|
|
CONSTANT: extra-root T{ vocabulary-root f "git@github.com:factor/factor" "extra/" }
|
|
|
|
|
|
|
|
: syntax-vocabulary ( -- vocabulary )
|
|
|
|
"syntax" <vocabulary> ;
|
|
|
|
|
|
|
|
TUPLE: word name effect quot ;
|
|
|
|
|
|
|
|
: add-word ( word vocabulary -- )
|
2017-09-30 15:14:23 -04:00
|
|
|
[ dup name>> ] [ words>> ] bi* set-at ;
|
|
|
|
|
|
|
|
|
|
|
|
: find-sections ( literals -- sections )
|
|
|
|
[ ?first section-open? ] filter ;
|
|
|
|
|
|
|
|
DEFER: map-literals
|
|
|
|
: map-literal ( obj quot: ( obj -- obj' ) -- obj )
|
|
|
|
over { [ array? ] [ ?first section-open? ] } 1&& [
|
|
|
|
[ first3 swap ] dip map-literals swap 3array
|
|
|
|
] [
|
|
|
|
call
|
|
|
|
] if ; inline recursive
|
|
|
|
|
|
|
|
: map-literals ( seq quot: ( obj -- obj' ) -- seq' )
|
|
|
|
'[ _ map-literal ] map ; inline recursive
|
|
|
|
|
|
|
|
|
|
|
|
DEFER: map-literals!
|
|
|
|
: map-literal! ( obj quot: ( obj -- obj' ) -- obj )
|
|
|
|
over { [ array? ] [ ?first section-open? ] } 1&& [
|
|
|
|
[ call drop ] [
|
|
|
|
map-literals!
|
|
|
|
] 2bi
|
|
|
|
] [
|
|
|
|
call
|
|
|
|
] if ; inline recursive
|
|
|
|
|
|
|
|
: map-literals! ( seq quot: ( obj -- obj' ) -- seq )
|
|
|
|
'[ _ map-literal! ] map! ; inline recursive
|
|
|
|
|
|
|
|
TUPLE: lexed tokens ;
|
|
|
|
|
|
|
|
TUPLE: comment < lexed payload ;
|
|
|
|
CONSTRUCTOR: <comment> comment ( tokens payload -- obj ) ;
|
|
|
|
|
|
|
|
TUPLE: section < lexed tag payload ;
|
|
|
|
CONSTRUCTOR: <section> section ( tokens tag payload -- obj ) ;
|
|
|
|
|
|
|
|
TUPLE: named-section < lexed tag name payload ;
|
|
|
|
CONSTRUCTOR: <named-section> named-section ( tokens tag name payload -- obj ) ;
|
|
|
|
|
|
|
|
TUPLE: upper-colon < lexed tag payload ;
|
|
|
|
CONSTRUCTOR: <upper-colon> upper-colon ( tokens tag payload -- obj ) ;
|
|
|
|
|
|
|
|
TUPLE: lower-colon < lexed tag payload ;
|
|
|
|
CONSTRUCTOR: <lower-colon> lower-colon ( tokens tag payload -- obj ) ;
|
|
|
|
|
|
|
|
TUPLE: matched < lexed tag payload ;
|
|
|
|
CONSTRUCTOR: <matched> matched ( tokens tag payload -- obj ) ;
|
|
|
|
|
|
|
|
TUPLE: identifier < lexed name ;
|
|
|
|
CONSTRUCTOR: <identifier> identifier ( tokens name -- obj ) ;
|
|
|
|
|
|
|
|
TUPLE: unknown < lexed ;
|
|
|
|
CONSTRUCTOR: <unknown> unknown ( tokens -- obj ) ;
|
|
|
|
|
|
|
|
|
|
|
|
: literal>tuple ( obj -- tuple )
|
|
|
|
{
|
|
|
|
{ [ dup slice? ] [ [ ] [ >string ] bi <identifier> ] }
|
|
|
|
{ [ dup ?first ?last "([{" member? ] [ { [ ] [ first >string ] [ rest but-last [ literal>tuple ] map ] } cleave <matched> ] }
|
|
|
|
{ [ dup ?first section-open? ] [
|
|
|
|
dup first ":" tail? [
|
|
|
|
{ [ ] [ first "<" ?head drop ] [ second >string ] [ rest but-last [ literal>tuple ] map ] } cleave <named-section>
|
|
|
|
] [
|
|
|
|
[ ] [ first "<" ?head drop ] [ rest but-last [ literal>tuple ] map ] tri <section>
|
|
|
|
] if
|
|
|
|
] }
|
|
|
|
{ [ dup array? ] [ [ literal>tuple ] map ] }
|
|
|
|
|
|
|
|
[ <unknown> ]
|
|
|
|
} cond ;
|
|
|
|
|
|
|
|
|
|
|
|
: literals>vocabulary ( literals -- vocabulary )
|
|
|
|
;
|