【发布时间】: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
我将在此处包含代码,但请注意,...这很粗糙。它太粗糙了,我实际上无法让它很好地落在这里的编码块下,所以我要链接它。
对于您将如何开展该项目或我是否做错了什么,我很感激。
代码目前抛出了一些错误(我很确定这是我在某处读取一些空字符的原因),但如果你忽略它们,它会吐出以控制正确的事情......主要是。
感谢您的帮助,感谢您花时间阅读所有这些混乱。
【问题讨论】:
-
代码链接不起作用(需要密码),但无论如何:您的问题与代码无关,是吗?我也建议删除 C++ 标签。
-
啊,睾丸,一秒钟。是的,我们开始了。解决了这个问题。
-
所以你想写一个程序把一个语法转换成Chomsky Normal Form?对吗?
-
也无法阅读代码,但是,就其价值而言,您似乎正在尝试将其作为文本操作来执行。相反,将语法读入数据结构(某种树),然后操纵树结构进行转换。最后,倒掉最后一棵树。
-
好的,我已经上传到pastebin了,应该可以了。
标签: lambda production context-free-grammar