[REBOL] Re: Parse learning problem (simple)
From: Tom::Conlin::gmail::com at: 29-Nov-2007 22:26
Joe Solinsky wrote:
> Hello,
>
> I would very much like to write a trivial parser that will consume the following format
>
> letter: charset [#"a" - #"z" #"A" - #"Z"]
> digit: charset [#"0" - #"9"]
> letter-or-digit: union letter digit
> valid-name: [letter any letter-or-digit]
> params: [valid-name | valid-name "," params]
> function-rule: [valid-name "(" params ")" ]
>
> and recognize the following input:
>
> parse "person(fred)" function-rule
> parse "buys(fred,shoes)" function-rule
>
> I would also dearly like to change function-rule and params
> to capture and store the "valid-name" values, related to each other.
> As usual, REBOL syntax is more "powerful" than I can understand.
>
> Also, a commentary question: I'm exploring first-order logic.
> Is REBOL a poor choice over Prolog for this?
>
> Thanks for your input.
> -Joe Solinsky
store: copy []
letter: charset [#"a" - #"z" #"A" - #"Z"]
digit: charset [#"0" - #"9"]
alphanum: union letter digit
valid-name: [letter any alphanum]
params: [
copy token valid-name
(insert/only tail store token)
opt ["," params]
]
function-rule: [
copy token valid-name
(insert/only tail store token)
"(" params ")"
]
;;; use /all whenever you make a block rule
parse/all "person(fred)" function-rule
parse/all "buys(fred,shoes)" function-rule
probe store
== ["person" "fred" "buys" "fred" "shoes"]