Common Lisp:表示语法规则的好方法吗?

Rog*_*llo 6 grammar common-lisp representation context-free-grammar

这是一个常见的Lisp数据表示问题。

代表语法的好方法是什么?“好的”是指表示简单,易于理解的表示形式,并且我可以在表示形式上进行操作而不必大惊小怪。表示不必特别有效;其他属性(简单,可理解,可处理)对我来说更重要。

这是一个示例语法:

Session ? Facts Question
Session ? ( Session ) Session
Facts ? Fact Facts
Facts ? ?
Fact ? ! STRING
Question ? ? STRING
Run Code Online (Sandbox Code Playgroud)

表示形式应允许对表示形式进行操作的代码易于区分终端符号和非终端符号。

非终端符号: Session, Facts, Fact, Question

端子符号: (, ), ?, !, ?

这种特殊的语法使用括号符号,这与Common Lisp使用括号符号相冲突。有什么好的方法来解决这个问题?

我希望我的代码能够识别空字符串的符号?。代表空字符串的符号的好方法是什么??

我希望我的代码能够区分语法规则的左侧和右侧。

以下是我要对表示形式执行的一些常见操作。

考虑以下规则:

A ? u1u2...un
Run Code Online (Sandbox Code Playgroud)

操作:我想获得语法规则右侧的第一个符号。然后我想知道:这是一个终端符号吗?是?符号吗?如果它是一个非结束符号,那么我想获得其语法规则。

Gus*_*ram 2

GRAIL(Lisp 语法)

我在第二个链接中包含了 GRAIL 的 BNF,以防它过期:

<grail-list>  ::= "'(" {<grail-rule>} ")"
<grail-rule>  ::= <assignment> | <alternation>
<assignment>  ::= "(" <type> " ::= " <s-exp> ")"
<alternation> ::= "(" <type> " ::= " <type> {<type>} ")"
<s-exp>       ::= <symbol> | <nonterminal> | "(" {<s-exp>} ")"
<type>        ::= "#(" <type-name> ")"
<nonterminal> ::= "#(" {<arg-name> " "} <type-name> ")"
<type-name>   ::= <symbol>
<arg-name>    ::= <symbol>
Run Code Online (Sandbox Code Playgroud)

DCG 格式(定句语法)

人工智能编程范式中有一个定子句语法的实现。从技术上讲它是 Prolog,但在书中它都是用 Lisp 实现的。

希望这可以帮助!

  • PAIP 代码的新链接是 https://github.com/norvig/paip-lisp/blob/master/lisp/grammar.lisp (2认同)