编程项目(课程项目)需要帮助。阅读语法,输出乔姆斯基

时间:2012-11-27 01:10:13

标签: lambda production context-free-grammar

所以我被分配了这个项目,并且已经给它了一个旧的大学尝试,但我有点迷失了如何去做。我们的想法是给你一个带有语法的txt文件:

  • V:S,A,B,C
  • T:a,b
  • S:S
  • P:
  • S - > AAAA | aABBA
  • A - > AAAA | $
  • B - > BB | BBC
  • C - >乙

这些制作规则不会是唯一经过测试的规则,但这只是一个例子。

所以第一步是阅读程序。 下一步是删除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

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

Code

我很欣赏你如何进行这个项目的任何想法,或者我正在做一些公然错误的事情。

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

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

1 个答案:

答案 0 :(得分:1)

这是我建议的架构:

  1. 定义语法的元语法(您正在使用的语法产品的语法)
  2. 为该元语法编写一个简单的标记化器
  3. 编写一个基于元语法的手写递归式解析器来解析并为每个输入语法生成创建语法树
  4. 根据CNF规则操作语法树
  5. 从修改后的语法树生成输出。
  6. 元语法示例:

    production:
        nonterminal ':' alternatives
    
    alternatives:
        alternative,
        alternative ',' alternatives
    
    alternative:
        symbols
    
    symbols:
        symbol,
        symbol symbols
    
    symbol:
        terminal,
        nonterminal,
        '$'
    
    etc..