Parsing 字符串语言的递归语法

Parsing 字符串语言的递归语法,parsing,recursion,grammar,Parsing,Recursion,Grammar,我被赋予以下任务: 为一个或多个字母的字符串语言编写递归语法。每个字符串的第一个字母必须是大写,字符串中的所有其他字母必须是小写 在阅读了有关语法的一章并探索了一些例子之后,我的尝试如下: <goodString> =<UpCh>|<UpCh> <ch> <UpCh> = A|B|C...|Z <ch> = a|b|c...|z =| =A | B | C..Z =a | b | c..z 或许 <goodS

我被赋予以下任务:

为一个或多个字母的字符串语言编写递归语法。每个字符串的第一个字母必须是大写,字符串中的所有其他字母必须是小写

在阅读了有关语法的一章并探索了一些例子之后,我的尝试如下:

<goodString> =<UpCh>|<UpCh> <ch> 

<UpCh> = A|B|C...|Z

<ch> = a|b|c...|z
=|
=A | B | C..Z
=a | b | c..z
或许

<goodString> =<UpCh>|<goodString> <ch>

<UpCh> = A|B|C...|Z

<ch> = a|b|c...|z
=|
=A | B | C..Z
=a | b | c..z

是这样吗?如果没有,我做错了什么?

现在你的语法不是递归的。递归语法将至少包括一个在右侧(直接或间接)调用自身的产品

在这种情况下,最明显的用法是“不确定数量的小写字母”。为此,我将一个小写字符串(或任何东西)定义为nil,或一个后跟小写字母的小写字符串。然后您的
单词将是一个大写字母,后跟一个小写字符串


请注意,对于这种情况,可以将小写字符串定义为后跟字符串的字符,或者定义为后跟字符的字符串。它们分别称为右递归和左递归。如果你有机会实现语法,你可能想知道你想要递归递归分析器的正确递归形式,但是一般倾向于自下而上的解析器,比如自下而上的解析器(比如很多发电机,比如YACC、BISON、BYACC++等等)。它似乎与如何概念化算法有关,而与如何实现算法的语言细节无关…@ZacHowland我也有同样的想法,所以我去移除了标签。哦。这实际上是我在基于C++的数据结构类中学习的东西:)@约翰彼得森:它确实更近了。它是否完全正确取决于对字符串的确切要求。具体来说,现在它将接受单个大写字母作为“字符串”。它的定义是大写字母后跟0或更多小写字母,还是1或更多小写字母?它说的是“为一个或多个字母的字符串语言编写递归语法”。因此我假设后跟0或更多小写字母。如果您可以为这两种情况提供代码,那太好了,因为我可以比较两者来更好地理解他的概念。@JohnPeterson:很抱歉“耽搁”,但是你的评论大约是在午夜和我的时间凌晨3点写的。无论如何,根据你的描述,我同意你目前的说法是正确的。