1 ! Copyright (C) 2008, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: lexer sets sequences kernel splitting effects
4 combinators arrays make vocabs.parser classes parser ;
10 ERROR: invalid-row-variable ;
11 ERROR: row-variable-can't-have-type ;
12 ERROR: stack-effect-omits-dashes ;
17 : end-token? ( end token -- token ? ) [ nip ] [ = ] 2bi ; inline
18 : effect-opener? ( token -- token ? ) dup { f "(" "((" "--" } member? ; inline
19 : effect-closer? ( token -- token ? ) dup { ")" "))" } member? ; inline
20 : row-variable? ( token -- token' ? ) ".." ?head ; inline
22 : parse-effect-var ( first? var name -- var )
24 [ ":" ?tail [ row-variable-can't-have-type ] when ] curry
25 [ invalid-row-variable ] if ;
27 : parse-effect-value ( token -- value )
30 { [ dup "(" = ] [ drop ")" parse-effect ] }
31 [ parse-word dup class? [ bad-effect ] unless ]
36 : parse-effect-token ( first? var end -- var more? )
38 { [ end-token? ] [ drop nip f ] }
39 { [ effect-opener? ] [ bad-effect ] }
40 { [ effect-closer? ] [ stack-effect-omits-dashes ] }
41 { [ row-variable? ] [ parse-effect-var t ] }
42 [ [ drop ] 2dip parse-effect-value , t ]
45 : parse-effect-tokens ( end -- var tokens )
47 [ t f ] dip [ parse-effect-token [ f ] 2dip ] curry [ ] while nip
50 : parse-effect ( end -- effect )
51 [ "--" parse-effect-tokens ] dip parse-effect-tokens
54 : complete-effect ( -- effect )
55 "(" expect ")" parse-effect ;
57 : parse-call( ( accum word -- accum )
58 [ ")" parse-effect ] dip 2array append! ;
60 : (:) ( -- word def effect )
63 parse-definition swap ;