common-lisp – Common Lisp:表示语法规则的好方法吗?

这是一个Common Lisp数据表示问题.

什么是表示语法的好方法? “好”是指一种简单,易于理解的表示,而且我可以在没有大惊小怪的情况下对表示进行操作.该表示不一定非常有效;其他属性(简单,易懂,可处理)对我来说更重要.

这是一个示例语法:

Session → Facts Question
Session → ( Session ) Session
Facts → Fact Facts
Facts → ε
Fact → ! STRING
Question → ? STRING

该表示应该允许对表示进行操作的代码容易地区分终端符号和非终端符号.

非终端符号:会话,事实,事实,问题

终端符号:(,),ε,!,?

这个特殊的语法使用括号符号,这与Common Lisp使用括号符号相冲突.处理这个问题的好方法是什么?

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

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

下面是我想对表示执行的一些常见操作.

考虑这条规则:

A → u1u2...un

操作:我想得到语法规则右边的第一个符号.然后我想知道:它是一个终端符号吗?它是ε符号吗?如果它是一个非终端符号,那么我想得到它的语法规则.

最佳答案 GRAIL(GRAmmar In Lisp)

> Description of GRAIL
> Slightly modified version of GRAIL with a function generator included

如果它到期,我将从第二个链接中包含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>

DCG格式(Definite Clause Grammar)

Paradigms of Artificial Intelligence Programming中有一个明确的子句语法的实现.从技术上来说它是Prolog,但它在本书中都被实现为Lisp.

> Grammar of English in DCG Format as used in PAIP
> DCG Parser

希望这可以帮助!

点赞