这是一个关于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
操作:我想要获取语法规则的右侧第一个符号。然后我想知道:它是终端符号吗?还是ε符号?如果它是非终端符号,那么我想获取它的语法规则。
E^
中的插入符号只是代表E'
。回想起来,我应该使用E*
,因为星号似乎是 Lisp 领域中通常的修饰符字符。我无法对这三个解析器进行太多评估,因为我从未在实际项目中使用过它们,这只是在大学学习各种解析器算法时为了自我教育而做的。 - Cactus