I'm creating some expert system with Clojure and I need to develop Recursive descent parser for reading rules from a text file and creating clojure functions from it. I have written function which checks if text file is ok with my grammar and it gives me list of strings with element such as function names, numbers, names of facts for my system, arithmetic and logical operators. That is how my grammar look like:
RULE := EXPR >> FACT
EXPR := ( WSK OpA NUM ) || ( FACT ) || ( EXPR OpL EXPR ) || (WSK OpA WSK)
OpL := AND || OR
OpA := > || < || ==
WSK := [A-Z]+
FACT := [a-z]+
NUM := [0-9]+\.?[0-9]*
And that's my function for checking grammar:
(defn wyr
"new expression"
[przetworzone doPrzetworzenia]
(cond
(empty? doPrzetworzenia) przetworzone
(empty? przetworzone) (if (empty? (acceptLP (first doPrzetworzenia)))
"error-poczatek";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptLP (first przetworzone)))) (if (empty? (acceptFACT (first doPrzetworzenia)))
(if (empty? (acceptWSK (first doPrzetworzenia)))
(if (empty? (acceptLP (first doPrzetworzenia)))
"error-LP";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptFACT (first przetworzone)))) (if (empty? (acceptPP (first doPrzetworzenia)))
"error-FACT";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptWSK (first przetworzone)))) (if (empty? (acceptOpA (first doPrzetworzenia)))
(if (empty? (acceptPP (first doPrzetworzenia)))
"error-WSK";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptOpA (first przetworzone)))) (if (empty? (acceptNUM (first doPrzetworzenia)))
(if (empty? (acceptWSK (first doPrzetworzenia)))
"error-OpA";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptPP (first przetworzone)))) (if (empty? (acceptOpL (first doPrzetworzenia)))
(if (empty? (acceptImplication (first doPrzetworzenia)))
"error-PP";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptOpL (first przetworzone)))) (if (empty? (acceptLP (first doPrzetworzenia)))
"error-OpL";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptImplication (first przetworzone)))) (if (empty? (acceptFACT (first doPrzetworzenia)))
"error-Implication";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptNUM (first przetworzone)))) (if (empty? (acceptPP (first doPrzetworzenia)))
"error-NUM";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
:else
"error")
)
Now I would like to create a clojure function from my list of string which above function gives to me. Do you have any idea how to do that?
UPDATE Here is an example of rule and hard coded version of it:
( ROC > 100 ) >> buy
(fn
(cond
(> (ROC) 100) "buy"
:else
()
)
)