【发布时间】:2013-06-24 14:44:11
【问题描述】:
我正在使用 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
()
)
)
【问题讨论】:
-
您能否包含更多上下文(双关语);)在哪里定义了acceptFACT acceptLP等。
-
您的示例中的 ROC 来自哪里(现有函数、参数或其他内容)?鉴于您正在调用它,它看起来像一个函数。另外,外部函数是否接受任何参数?我现在假设函数并且没有参数。
-
你的语法正确吗?它不支持 WSK 和 FACT 有多个字符,并且 FACT 只是小写,而您给出的示例使用大写。同样的问题也适用于购买 - 我不知道它来自哪里。既然你没有调用它,我将假设变量,尽管它看起来也像一个字符串。
-
好的,我更新了我的更新。阻止,ROC 是一个没有参数的函数,如果名为 ROC 的函数返回的值大于 100,我想返回字符串“buy”。我还更新了我的语法,所以现在 WSK 和 FACT 可以有多个字符。
标签: clojure expert-system recursive-descent