字符串语言的递归语法

时间:2013-10-14 04:32:06

标签: parsing recursion grammar

我接到了以下任务:

  

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

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

<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

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

1 个答案:

答案 0 :(得分:3)

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

在这种情况下,明显的使用地点是“无限数量的小写字母”。为此,我将小写字符串(或其他)定义为nil,或小写字符串后跟小写字母。然后你的word将是一个大写字母,后跟一个小写字符串。

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