grammpy库的一组转换。

grammpy-transforms的Python项目详细描述


grammpy转换构建状态覆盖状态fromgrammpy_transformsimportContextFreenew_g=ContextFree.remove_unreachable_symbols(g)new_g=ContextFree.remove_nongenerating_nonterminals(g)new_g=ContextFree.remove_useless_symbols(g)ContextFree.is_grammar_generating(g)

epsilon规则消除

方法创建新规则,用可重写为epsilon规则的非终结符替换规则。 您也只能搜索非终结符,它们与epsilon在右侧的规则一致。

fromgrammpyimport*fromgrammpy_transformsimportContextFreeclassOldRules(Rule):rules=[([A],[B,C]),([B],[EPS])]ContextFree.find_nonterminals_rewritable_to_epsilon(g)# list of nonterminalsnew_g=ContextFree.remove_rules_with_epsilon(g)classNewRules(Rule):rules=[([A],[B,C]),([A],[C])]assertnew_g.have_rule(NewRules)isTrue

库创建自己类型的规则,以便可以回溯更改。 类型是contextfree.epsilonremovedrule

classCreatedRule(Rule):rule=([A],[C])created=new_g.get_rule(CreatedRule)assertcreated.from_rule.rule==([A],[B,C])assertcreated.replace_index==0assertissubclass(created,ContextFree.EpsilonRemovedRule)

删除单位规则

与epsilon规则删除一样,删除单元规则的方法创建新规则,从而删除无效规则。 您可以转换语法或只找到可到达的符号。

fromgrammpyimport*fromgrammpy_transformsimportContextFreeclassOldRules(Rule):rules=[([A],[B]),([B],[C]),([B],[0]),([C],[1])]reach=ContextFree.find_nonterminals_reachable_by_unit_rules(g)# instance of ContextFree.UnitSymbolRechablingResultsassertreach.reach(A,B)isTrueassertreach.reachables(A)==[A,B,C]path=reach.path_rules(B,C)# list of unit rulesassertpath[0].rule==([B],[C])new_g=ContextFree.remove_unit_rules(g)classNewRules(Rule):rules=[([A],[0]),([A],[1]),([B],[0]),([C],[1])]assertnew_g.have_rule(NewRules)isTrue

方法创建自己类型的规则(ContextFree.ReducedUnitRule),您可以回溯转换。

classAto1Rule(Rule):rule=([A],[1])created=new_g.get_rule(Ato1Rule)assertcreated.by_rules[0].rule==([A],[B])assertcreated.by_rules[1].rule==([B],[C])assertcreated.end_rule.rule==([C],[1])

转换为chomsky范式

方法将语法转换为乔姆斯基范式。

此操作创建了许多自己的类型,以方便对转换进行回溯。

基类是contextfree.chomskynonterminalcontextfree.chomskyrule,它们是other的基类。

as nonterminals方法使用contextfree.chomskytermnotterminal表示可重写到终端的非终端(a->;a)。nonterminal具有用于术语的属性,其中它存储终端(作为终端类)。 第二类是contextfree.chomskygroupnonterminal,它表示一组符号(例如,在规则a->;bcd中,这个非terminal表示cd)。此非终结符具有属性,其中存储表示的符号列表。

对于rules方法,创建类列表,其中每个类具有不同的含义:

  • contextfree.chomskysplitrule:表示被拆分为只包含两个符号的规则。在属性中,from_rule存储原始规则。
  • contextfree.chomskyrestrile:表示规则拆分后的右侧部分。如前所述,infrom_rule属性存储原始规则。 拆分时,chomskysplitrule和chomskyrestrile表示原始的整个规则:a->;bcde==>;a->;bx和x->;cde
  • contextfree.chomskyterminalreplaceRule:此类用于规则包含非终结符with terminal的情况。规则转换为状态,其中终端是替换为可重写到该终端的非终结符。 类具有存储原始规则的from_rule属性和指示替换了哪个终端的replace_index属性。
  • contextfree.chomskytermrule:它是rule的类,直接将非终结符重写到终端。

逆运算

epsilon规则的消除、单位规则的消除和chomsky范式的转换都有逆运算。 它们在InverseContextFree类上实现。

函数只需要解析树的根非终结符。然后它们遍历解析树,并用它们原来的等价物替换由转换创建的规则。

这些操作需要按相反的顺序执行,即发生转换。

拆分规则

因为语法类拆分规则,它代表两个以上的规则, 需要一种算法,用原来的分割规则代替原来的分割规则。 该算法是在inversecomon类as分割规则静态方法上实现的。

这个电话必须是最后一个。此外,如果您的所有规则都只定义了一条规则,则不需要调用此函数。

算法目前只为上下文无关文法实现。

在下面的grammpy库版本中,被拆分的规则的行为应该与它们原来的对应规则相同。 这种方法将比反映它,并且在将来可能有空的实现。

助手

库提供了1.2.0版的类,有助于解析树操作和遍历。

操作可以用不同的规则替换特定的规则、非终结符或终结符。 新元素将被添加到解析树中,并正确连接到其余元素。

fromgrammpy_transformsimportManipulation# ...parsed=cyk(...)Manipulation.replaceNode(parsed,MyNewNonterminal())Manipulation.replaceRule(parsed.to_rule,MyNewRule())# or use type deductionsManipulation.replace(parsed,MyNewNonterminal())Manipulation.replace(parsed.to_rule,MyNewRule())

第二类是遍历。它包含用于后序和前序遍历的静态方法。 方法遍历非终端、终端甚至规则。如果只想遍历非终结符,请使用过滤器内置函数。

fromgrammpy_transformsimportTraversing# ...Traversing.postOrder(parsed)Traversing.preOrder(parsed)

您可以通过调用静态方法创建自己的遍历路径。 方法接受解析树的根,函数接受当前遍历节点和回调。 传递的方法必须对要遍历的每个节点调用回调。

fromgrammpy_transformsimportTraversing# ...defpost_order_traversing(elem,callback):ifisinstance(elem,Nonterminal):forchinelem.to_rule.to_symbols:yieldcallback(ch)yieldchTraversing.traverse(parsed,post_order_traversing)

或者,您可以使用traverseseparated静态方法,为非终端、终端和规则调用不同的函数。

defpostOrder(root):deftravRule(item,callback):resp=[callback(ch)forchinitem.to_symbols]returnfunctools.reduce(operator.add,resp,[])+[item]deftravNonterm(item,callback):returncallback(item.to_rule)+[item]deftravTerm(item,callback):return[item]returnTraversing.traverseSeparated(root,travRule,travNonterm,travTerm)

类遍历还提供print静态方法,该方法返回表示ast结构的字符串。

fromgrammpy_transformsimportContextFreenew_g=ContextFree.remove_unreachable_symbols(g)new_g=ContextFree.remove_nongenerating_nonterminals(g)new_g=ContextFree.remove_useless_symbols(g)ContextFree.is_grammar_generating(g)
0

路线图

目前只执行了一小部分操作。

库应至少支持这些操作:

  • 将语法转换为有效的ll(k)语法
  • 递归的删除
  • 转换成另一种表示形式(如从常规语法到状态机),但这可能会在单独的包中。

版本:1.2.5

作者:帕特里克·瓦尔科维奇

许可证:GNU通用公共许可证v3.0

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java关闭到DB的连接不会关闭所有连接   java如何跟踪eclipse中编译错误的错误?   java设计/实现。。。最有可能使用AJAX   java无法从SharedReference获取数据   在java中,用|将印地语段落串成   java以编程方式在单击时创建微调器工作   java对如何完成新程序的困惑?   java停止httpConnection blackberry超时   java为什么继承的静态变量可以被子类的非静态方法访问?   java Spring安全性通过控制器进行身份验证   java类继承和泛型类型   创建票证服务时CAS重定向上的java错误   使用java的sockets对等应用程序