+: boolean? ( -- bool )
+ nextchar [char] # <> if false exit then
+
+ push-parse-idx
+ inc-parse-idx
+
+ nextchar [char] t <>
+ nextchar [char] f <>
+ and if pop-parse-idx false exit then
+
+ inc-parse-idx
+ delim? if
+ pop-parse-idx
+ true
+ else
+ pop-parse-idx
+ false
+ then
+;
+
+: str-equiv? ( str -- bool )
+
+ push-parse-idx
+
+ true -rot
+
+ swap dup rot + swap
+
+ do
+ i @ nextchar <> if
+ drop false
+ leave
+ then
+
+ inc-parse-idx
+ loop
+
+ delim? false = if drop false then
+
+ pop-parse-idx
+;
+
+: character? ( -- bool )
+ nextchar [char] # <> if false exit then
+
+ push-parse-idx
+ inc-parse-idx
+
+ nextchar [char] \ <> if pop-parse-idx false exit then
+
+ inc-parse-idx
+
+ S" newline" str-equiv? if pop-parse-idx true exit then
+ S" space" str-equiv? if pop-parse-idx true exit then
+ S" tab" str-equiv? if pop-parse-idx true exit then
+
+ charavailable? false = if pop-parse-idx false exit then
+
+ pop-parse-idx true
+;
+
+: pair? ( -- bool )
+ nextchar [char] ( = ;
+
+: string? ( -- bool )
+ nextchar [char] " = ;
+
+: initial? ( -- bool )
+ nextchar [char] A >= nextchar [char] Z <= and if true exit then
+ nextchar [char] a >= nextchar [char] z <= and if true exit then
+ nextchar [char] * = if true exit then
+ nextchar [char] / = if true exit then
+ nextchar [char] > = if true exit then
+ nextchar [char] < = if true exit then
+ nextchar [char] = = if true exit then
+ nextchar [char] ? = if true exit then
+ nextchar [char] ! = if true exit then
+ false
+;
+
+: symbol? ( -- bool )
+ initial? if true exit then
+ nextchar [char] + =
+ nextchar [char] - = or if
+ inc-parse-idx
+ delim? if dec-parse-idx true exit then
+ dec-parse-idx
+ then
+ false
+;
+