2

我被赋予了以下任务:

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

在阅读了语法章节并探索了一些例子之后,这是我的尝试:

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

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

<ch> = a|b|c...|z

或者可能

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

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

<ch> = a|b|c...|z

这是正确的吗?如果不是,我做错了什么?

4

1 回答 1

3

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

在这种情况下,明显的使用位置将是“不确定数量的小写字母”。为此,我将一个小写字符串(或其他)定义为 nil,或者一个小写字符串后跟一个小写字母。然后您word将是一个大写字母,后跟一个小写字符串。

请注意,对于这种情况,您可以将小写字符串定义为一个字符后跟一个字符串,或者定义为一个字符串后跟一个字符。这些分别称为右递归和左递归。如果您有任何机会实现该语法,您可能想知道您想要递归下降解析器的右递归形式,但通常更喜欢自底向上解析器的左递归形式(例如许多生成器,如 yacc , Bison, byacc 等, 产生)。

于 2013-10-14T04:39:36.643 回答