【问题标题】:Programming Project (Course Project) Need Help. Read Grammar, output Chomsky编程项目(课程项目)需要帮助。读语法,输出乔姆斯基
【发布时间】:2012-11-27 01:10:13
【问题描述】:

所以我被分配了这个项目,并且一直在尝试旧的大学,但我对如何去做有点迷茫。这个想法是给你一个 txt 文件,其语法格式为:

  • V:S、A、B、C
  • T:a,b
  • S:S
  • 笔:
  • S -> aAaA|aABBA
  • A -> AaaA|$
  • B -> bB|bbC
  • C -> B

这些产生式规则不会是唯一经过测试的规则,但这只是一个示例。

所以第一步是读入程序。 下一步是删除 Lambda ($) 产生式。 最后一步是删除单元产品。

我是……我删除 lambda 产品的方式并不是我认为的最佳方式。

这就是我的做法。

首先,使用 getline 读取文件。 接下来使用一些循环来遍历文件。

现在在一个数组中,我存储了与具有 lambda 产生式的规则相对应的非终结符,因此请记住这一点。

因此,在遍历每个产生式中的每个字符时,检查该字符是否与表示 lambda 产生式的非终结符数组中的一个相同(不包括索引 0,因为那是产生式的开始)

如果您找到匹配项,请标记您所在的索引

所以说你正在经历 S。

S -> a(没问题) s -> aA(好吧有点问题)

不要写A,不要。跳过它,然后使用另一个循环,打印出该生产规则的剩余部分(也就是说,打印出直到你碰到一个条) 所以我们得到 S->aaA

现在画一个条形

S -> aaA| 现在将索引返回到该块中的第一个字符,这里是 a。从那里,将字符重写到您第一次点击非终端的位置。

S -> aaA|aA

现在继续循环查找下一个非终结符,即 lambda

S -> aaA | aAaA(我们在这里)

画一个条

S -> aaA |啊啊|

回到起点,继续

S -> aaA |啊啊|啊啊啊

继续阅读语法并输出每个字符并重复此过程以获得

S -> aaA |啊啊|啊啊啊| aABB | aBBA | aABBA

在所有代码的末尾,我有两个循环来检查语法中的原始小节(当我这样做时,我将它们替换为!),然后在最后输出包含所有 lambda 产品的表单作为 lambdas 给予

S -> aaA |啊啊|啊啊啊|啊 | aABB | aBBA | aABBA | aBB

我将在此处包含代码,但请注意,...这很粗糙。它太粗糙了,我实际上无法让它很好地落在这里的编码块下,所以我要链接它。

Code

对于您将如何开展该项目或我是否做错了什么,我很感激。

代码目前抛出了一些错误(我很确定这是我在某处读取一些空字符的原因),但如果你忽略它们,它会吐出以控制正确的事情......主要是。

感谢您的帮助,感谢您花时间阅读所有这些混乱。

【问题讨论】:

  • 代码链接不起作用(需要密码),但无论如何:您的问题与代码无关,是吗?我也建议删除 C++ 标签。
  • 啊,睾丸,一秒钟。是的,我们开始了。解决了这个问题。
  • 所以你想写一个程序把一个语法转换成Chomsky Normal Form?对吗?
  • 也无法阅读代码,但是,就其价值而言,您似乎正在尝试将其作为文本操作来执行。相反,将语法读入数据结构(某种树),然后操纵树结构进行转换。最后,倒掉最后一棵树。
  • 好的,我已经上传到pastebin了,应该可以了。

标签: lambda production context-free-grammar


【解决方案1】:

这是我推荐的架构:

  1. 定义语法的元语法(您正在使用的语法产生式的语法)
  2. 为该元语法编写一个简单的分词器
  3. 编写一个基于元语法的手写递归体面解析器,对每个输入语法产生式进行解析和创建语法树
  4. 根据 CNF 规则操作语法树
  5. 从修改后的语法树生成输出。

元语法示例:

production:
    nonterminal ':' alternatives

alternatives:
    alternative,
    alternative ',' alternatives

alternative:
    symbols

symbols:
    symbol,
    symbol symbols

symbol:
    terminal,
    nonterminal,
    '$'

etc..

【讨论】:

  • 我使用元语法这个词来区分输入语法和输入语法的语法(因此是“元”语法)。我会为你做一个开始
  • 我很难掌握元数据,但谢谢。感谢你给我的任何开始。
  • 我已经在我的帖子中添加了一个开始。
  • 哦哦!这东西,好吧,这很熟悉。
  • 天哪,这仍然很难。不过还是谢谢。
猜你喜欢
  • 2012-07-17
  • 2011-02-25
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 2012-08-07
相关资源
最近更新 更多