【问题标题】:Recursive grammar for the language of strings字符串语言的递归文法
【发布时间】:2013-10-15 04:46:56
【问题描述】:

我被分配了以下任务:

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

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

<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

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

【问题讨论】:

  • 为什么将其标记为 C++?它似乎与如何概念化算法有关,与如何实现它的语言细节无关......
  • @ZacHowland 我也是这么想的,所以我去删除了标签。
  • 哦。这实际上是我在基于 C++ 的数据结构课程中学到的东西 :)

标签: parsing recursion grammar


【解决方案1】:

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

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

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

【讨论】:

  • @JohnPeterson:这肯定是 很多 更接近。它是否完全正确取决于您的字符串的 exact 要求。具体来说,现在它将接受一个大写字母作为“字符串”。它是定义为一个大写字母后跟 0 个或多个小写字母,还是定义为 1 个或多个小写字母?
  • 它说“为一个或多个字母的字符串语言编写递归语法”。所以我假设后面是 0 个或多个小写字母。
  • 如果你能提供这两种情况的代码,那就太好了,因为我可以比较两者以更好地理解他的概念。
  • @JohnPeterson:抱歉“延迟”,但您的 cmets 大约是在我的时间午夜和凌晨 3:00 写的。无论如何,根据您的描述,我同意您当前的表述是正确的。
猜你喜欢
  • 2016-08-02
  • 2016-01-30
  • 2016-11-26
  • 2011-03-04
  • 2012-02-28
  • 1970-01-01
  • 2020-06-26
  • 2013-06-15
  • 1970-01-01
相关资源
最近更新 更多