Adding infix and parsing example.
This commit is contained in:
24
examples/infix/infix_generic.fs
Executable file
24
examples/infix/infix_generic.fs
Executable file
@ -0,0 +1,24 @@
|
||||
#! /usr/bin/env ueforth
|
||||
|
||||
vocabulary infix infix definitions
|
||||
|
||||
variable pending
|
||||
: token ( -- a ) >in @ tib + ;
|
||||
: full? ( -- f ) >in @ #tib @ < ;
|
||||
: ( token 0
|
||||
begin full? over 0< 0= and while
|
||||
token c@ [char] ( = if 1+ then
|
||||
token c@ [char] ) = if 1- then
|
||||
1 >in +!
|
||||
repeat
|
||||
drop token over - 1- 0 max
|
||||
dup 0= pending ! evaluate ; immediate
|
||||
: scarf bl parse evaluate
|
||||
pending @ if postpone ( then ;
|
||||
: enact state @ if , else execute then ;
|
||||
: + scarf ['] + enact ; immediate
|
||||
: - scarf ['] - enact ; immediate
|
||||
: * scarf ['] * enact ; immediate
|
||||
: / scarf ['] / enact ; immediate
|
||||
|
||||
forth definitions
|
||||
87
examples/infix/infix_parsing.fs
Executable file
87
examples/infix/infix_parsing.fs
Executable file
@ -0,0 +1,87 @@
|
||||
#! /usr/bin/env ueforth
|
||||
|
||||
needs parsing.fs
|
||||
also internals
|
||||
|
||||
: space? ( ch -- f )
|
||||
dup bl = over nl = or over 10 = or swap 9 = or ;
|
||||
|
||||
kind <SPACE>
|
||||
{{ }}
|
||||
{{ @token space? 0= throw +token <SPACE> }}
|
||||
|
||||
: st' postpone <SPACE> postpone t' postpone <SPACE> ; immediate
|
||||
: st" postpone <SPACE> postpone t" postpone <SPACE> ; immediate
|
||||
|
||||
kind <DIGIT>
|
||||
{{ [char] 0 [char] 9 []token [char] 0 - }}
|
||||
|
||||
: letnum? ( ch -- f )
|
||||
dup [char] 0 [char] 9 within
|
||||
over [char] A [char] Z within or
|
||||
over [char] a [char] z within or
|
||||
swap [char] _ = or ;
|
||||
|
||||
kind <IDENTIFIER>
|
||||
{{ >in @ tib + 0 begin @token letnum? while 1+ +token repeat dup 0= throw }}
|
||||
|
||||
kind <NUMBER'>
|
||||
{{ <DIGIT> 1 }}
|
||||
{{ <DIGIT> <NUMBER'> rot over 0 do 10 * loop -rot 1+ >r + r> }}
|
||||
kind <NUMBER>
|
||||
{{ <NUMBER'> drop aliteral }}
|
||||
|
||||
kind <FORTH>
|
||||
{{ [char] ] parse evaluate }}
|
||||
|
||||
kind <EXPRESSION'>
|
||||
|
||||
kind <IDENTIFIERS>
|
||||
{{ }}
|
||||
{{ <SPACE> <IDENTIFIER> <SPACE> evaluate <IDENTIFIERS> }}
|
||||
|
||||
kind <FACTOR>
|
||||
{{ <SPACE> <IDENTIFIER> <SPACE> evaluate <IDENTIFIERS> }}
|
||||
{{ <SPACE> <NUMBER> <SPACE> }}
|
||||
{{ st' ( <EXPRESSION'> st' ) }}
|
||||
{{ st' [ <FORTH> }}
|
||||
|
||||
kind <TERM>
|
||||
{{ <FACTOR> }}
|
||||
{{ <FACTOR> st' * <TERM> postpone * }}
|
||||
{{ <FACTOR> st' / <TERM> postpone / }}
|
||||
{{ <FACTOR> st" mod" <TERM> postpone mod }}
|
||||
{{ <FACTOR> st" and" <TERM> postpone and }}
|
||||
|
||||
kind <SIMPLE-EXPRESSION>
|
||||
{{ <TERM> }}
|
||||
{{ <TERM> st' + <SIMPLE-EXPRESSION> postpone + }}
|
||||
{{ <TERM> st' - <SIMPLE-EXPRESSION> postpone - }}
|
||||
{{ <TERM> st" or" <SIMPLE-EXPRESSION> postpone or }}
|
||||
{{ st' + <SIMPLE-EXPRESSION> }}
|
||||
{{ st' - <SIMPLE-EXPRESSION> postpone negate }}
|
||||
|
||||
kind <EXPRESSION>
|
||||
{{ <SIMPLE-EXPRESSION> }}
|
||||
{{ <SIMPLE-EXPRESSION> st' = <EXPRESSION> postpone = }}
|
||||
{{ <SIMPLE-EXPRESSION> st" <>" <EXPRESSION> postpone <> }}
|
||||
{{ <SIMPLE-EXPRESSION> st' < <EXPRESSION> postpone < }}
|
||||
{{ <SIMPLE-EXPRESSION> st" <=" <EXPRESSION> postpone <= }}
|
||||
{{ <SIMPLE-EXPRESSION> st" >=" <EXPRESSION> postpone >= }}
|
||||
{{ <SIMPLE-EXPRESSION> st' > <EXPRESSION> postpone > }}
|
||||
|
||||
' <EXPRESSION'> :{{ <EXPRESSION> }}
|
||||
|
||||
kind <STATEMENTS>
|
||||
{{ <EXPRESSION> <STATEMENTS> }}
|
||||
{{ st' } }}
|
||||
|
||||
kind def
|
||||
{{ : st' { postpone { st' { <STATEMENTS> postpone ; }}
|
||||
|
||||
kind on
|
||||
{{ ' :{{ st' { <STATEMENTS> postpone }} }}
|
||||
|
||||
kind expr
|
||||
{{ :noname <EXPRESSION> postpone ; execute }}
|
||||
|
||||
22
examples/infix/infix_ueforth.fs
Executable file
22
examples/infix/infix_ueforth.fs
Executable file
@ -0,0 +1,22 @@
|
||||
#! /usr/bin/env ueforth
|
||||
|
||||
vocabulary infix infix definitions also internals
|
||||
|
||||
: token ( -- a ) >in @ tib + ;
|
||||
: full? ( -- f ) >in @ #tib @ < ;
|
||||
: ( token 0
|
||||
begin full? over 0< 0= and while
|
||||
token c@ [char] ( = if 1+ then
|
||||
token c@ [char] ) = if 1- then
|
||||
1 >in +!
|
||||
repeat
|
||||
drop token over - 1- 0 max
|
||||
evaluate ; immediate
|
||||
: scarf +evaluate1 ;
|
||||
: enact state @ if , else execute then ;
|
||||
: + scarf ['] + enact ; immediate
|
||||
: - scarf ['] - enact ; immediate
|
||||
: * scarf ['] * enact ; immediate
|
||||
: / scarf ['] / enact ; immediate
|
||||
|
||||
previous forth definitions
|
||||
21
examples/infix/parsing.fs
Normal file
21
examples/infix/parsing.fs
Normal file
@ -0,0 +1,21 @@
|
||||
: kind ( "name" -- )
|
||||
create 0 ,
|
||||
does> @ begin dup while
|
||||
state @ >r here >r >in @ >r
|
||||
dup >r @ catch 0= if rdrop rdrop rdrop rdrop exit then
|
||||
r> cell+ @
|
||||
r> >in ! r> here - allot r> state !
|
||||
repeat
|
||||
-1 throw ;
|
||||
: :{{ >body :noname ;
|
||||
: {{ latestxt :{{ ;
|
||||
: }} postpone ; here >r , dup @ , r> swap ! ; immediate
|
||||
: @token ( -- ch ) >in @ tib + c@ ;
|
||||
: +token 1 >in +! ;
|
||||
: =token ( ch -- ) @token <> throw +token ;
|
||||
: within ( ch a b ) >r over <= swap r> <= and ;
|
||||
: []token ( a b -- ch ) @token -rot within 0= throw @token +token ;
|
||||
: t' postpone [char] postpone =token ; immediate
|
||||
: stoken ( a n -- ) 0 ?do dup c@ =token 1+ loop drop ;
|
||||
: t" postpone s" postpone stoken ; immediate
|
||||
|
||||
Reference in New Issue
Block a user