首页 > 解决方案 > Racket 的语法解析:标识符与预期不匹配

问题描述

我在使用 Racket 时遇到问题syntax-parse。特别是,我收到以下错误消息:

unknown: rule: expected one of these identifiers: `model', `line', or `rule'
at: rule
in: (rule (predicate (symbol "T") "[" (symbol-list (symbol "X")) "]") "<-" (predicate (symbol "Q") "[" (symbol-list (symbol "X")) "]"))

为什么rule语法对象与标识符不匹配?我正在调用该函数,如下所示:

(define (parse-carl s)
(syntax-parse s
    [((~literal model) ~rest x)
        (with-syntax ([x (map parse-carl (syntax-e #'x))]) #'x)]
    [((~literal line) x) (with-syntax ([x (parse-carl #'x)]) #'x)]
    [((~literal rule) p1 "<-" p2) 'ok]))

这是输入(通过syntax->datum):

(model (line (rule (predicate (symbol T) [ (symbol-list (symbol X)) ]) <- (predicate (symbol Q) [ (symbol-list (symbol X)) ]))) 
(line (rule (predicate (symbol Y) [ (symbol-list (symbol X)) ]) <-   (predicate (symbol Q) [ (symbol-list (symbol X)) ]))) 
(line (rule (predicate (symbol Y) [ (symbol-list (symbol X)) ]) <- (predicate (symbol T) [ (symbol-list (symbol X)) ]))) 
(line (query (rule (predicate (symbol Y) [ (symbol-list (symbol X)) ]) <- (predicate (symbol T) [ (symbol-list (symbol X)) ])) ?)) 
)

提前致谢。

标签: parsingschemeracket

解决方案


实际上是rule定义的吗?~literal识别绑定,因此如果没有绑定,它将不起作用。~datum在这种情况下,您将需要。


推荐阅读