所以我被分配了这个项目,并且已经给它了一个旧的大学尝试,但我有点迷失了如何去做。我们的想法是给你一个带有语法的txt文件:
这些制作规则不会是唯一经过测试的规则,但这只是一个例子。
所以第一步是阅读程序。 下一步是删除Lambda($)产品。 最后一步是删除单位制作。
我......我正在删除lambda制作的方式并不是我想的最佳方式。
以下是我的表现方式。
首先,使用getline读取文件。 接下来使用一些循环来浏览文件。
现在在一个数组中,我已经存储了与lambda生成规则相对应的非终端,所以请记住这一点。
因此,在浏览每个制作中的每个字符时,检查该字符是否与表示lambda产生的非终端数组中的字符相同(不包括索引0,因为这是生产的开始)
如果找到匹配项,请标记您所在的索引
所以说你要经历S。
S - >一个(没问题) s - > aA(确定有点问题)
而不是写A,不要。跳过它,然后使用另一个循环,打印出该生产规则的剩余部分(即打印出来,直到你点击一个栏) 所以我们得到了 S - > AAA
现在画一条吧
S - > AAA | 现在将索引返回到此块中的第一个字符,这里是a。从那里,将字符重写到第一次点击非终端的位置。
S - > AAA | AA
现在继续循环查找下一个非终端,即lambda
S - > aaA | aAaA(我们在这里)
画一个栏
S - > aaA | aAa |
回到开头,继续
S - > aaA | aAa | AAAA
继续阅读语法并输出每个字符并重复此过程以获得
S - > aaA | aAa | aAaA | aABB | aBBA | aABBA
在所有代码的末尾,我有两个循环来检查语法中的原始条形(当我这样做时,我用!替换它们)然后输出具有所有lambda产生的形式的结尾作为lambdas给予
S - > aaA | aAa | aAaA | aa | aABB | aBBA | aABBA | ABB
我将在这里包含代码但是,请注意,......这很粗糙。它足够粗糙,我实际上无法让它在这里的编码块下很好地落下,所以我要链接它。
我很欣赏你如何进行这个项目的任何想法,或者我正在做一些公然错误的事情。
代码目前抛出了一些错误(我很确定这是我在某处读取一些空字符的原因),但是如果你忽略它们,它会吐出来控制正确的东西......主要是。
感谢任何帮助,感谢您花时间阅读所有这些混乱。
答案 0 :(得分:1)
这是我建议的架构:
元语法示例:
production:
nonterminal ':' alternatives
alternatives:
alternative,
alternative ',' alternatives
alternative:
symbols
symbols:
symbol,
symbol symbols
symbol:
terminal,
nonterminal,
'$'
etc..