我正在使用 Clojure 创建一些专家系统,我需要开发递归下降解析器来从文本文件中读取规则并从中创建 clojure 函数。我编写了一个函数,它检查文本文件是否符合我的语法,它给了我字符串列表,其中包含函数名称、数字、我的系统的事实名称、算术和逻辑运算符等元素。这就是我的语法的样子:
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]*
这就是我检查语法的功能:
(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")
)
现在我想从上面的函数给我的字符串列表中创建一个 clojure 函数。你知道怎么做吗?
更新 这里是规则的一个例子和它的硬编码版本:
( ROC > 100 ) >> 购买
(fn
(cond
(> (ROC) 100) "buy"
:else
()
)
)