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

时间:2016-03-23 22:01:53

标签: common-lisp grammar context-free-grammar representation

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

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

这是一个示例语法:

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

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

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

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

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

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

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

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

考虑这条规则:

A → u1u2...un

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

1 个答案:

答案 0 :(得分:1)

GRAIL(GRAmmar In Lisp)

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

.mens1:focus ~ div[class^='mention']{
    display:none;
}

DCG格式(确定条款语法)

Paradigms of Artificial Intelligence Programming中有一个明确的子句语法的实现。从技术上讲,它是Prolog,但它在书中都以Lisp的形式实现。

希望这有帮助!