zoukankan      html  css  js  c++  java
  • 文法分类的python实现

    #-*-coding:utf-8-*-
    G = raw_input("提示输入文法:");  #G为文法
    S = G[2]  #识别符号S
    
    Vn = raw_input("提示输入Vn:");  #Vn为非终结符号集
    charactersVn = Vn.split(',');  #记录每个非终结符号
    VnString = "";
    for var in charactersVn:
        VnString += var + ",";
    vAll = [];
    lefties = [];  #所有产生式左边的符号
    setAllVt = set([]);  #含重复元素
    setVtAndVn = set([]);  #非终结符号集的集合
    
    P = raw_input("提示依次输入产生式规则:");  #P为产生式集
    setP = P.split();  #根据空格分
    for varP in setP:
        n_t = varP.split('::='); 
    #    leftOfP = n_t[0];  #产生式左边
        lefties.append(n_t[0]);
        rightOfP = n_t[1];  #产生式右边
        rightChar = rightOfP.split('|');  #产生式右边的分割
        setAllVt = setAllVt | set(rightChar);  #所有产生式右边的式子的集合
    
    #只保留式子右边中的单个符号
    for ele in list(setAllVt):
     #   if len(ele) == 1:
     #       setVtAndVn = setVtAndVn | set(ele);
        for i in range(0, len(ele)):
            setVtAndVn = setVtAndVn | set(ele[i]);
    
    setVt = list(setVtAndVn - set(charactersVn))  #利用集合的差求非终结符号集
    VtString = "";
    for var in setVt:
        VtString += var + ",";
    #print setVt;
    
    #print len(lefties);
    flag = 0;  #代表几型文法
    length = 0;
    #记录并判断产生式左边长度是否都为1
    for varLefty in lefties:
        length += len(varLefty)
    
    if length == len(lefties):  #长度都为1
        flag = 2;
    else:
        flag = 1;
    
    #在0型文法和1型文法之间进行判断
    if flag == 1:
        for varP in setP:
            n_t = varP.split('::=');
        left = n_t[0];
            right = n_t[1];
            righties = right.split('|');
            for righty in righties:
                if len(left) > len(righty):
                    flag = 0;
    
    #在2型文法和3型文法中间进行选择
    count = 0;
    total = 0;
    twoOrThird = 0;
    if flag == 2:
        twoOrThird = 1;
        for varP in setP:
            n_t = varP.split('::=');
            right = n_t[1];  #::=的左边
            righties = right.split('|');  #|分割后的每个产生式右边(由于表达形式的原因,要再次区分并计数)
            for righty in righties:
                total += 1;
                if len(righty) == 1 and righty[0] in setVt:  #右边为单个终结符合
                    count += 1;
                elif len(righty) == 2 and righty[0] in setVt and righty[1] in charactersVn:  #右边为单个终结符号加单个非终结符号
                    count += 1;
    
    if count == total and twoOrThird == 1:
        flag = 3;
    
    print "文法" + G + "= ({" + VnString[:-1] + "} ,{" + VtString[:-1] + "}, P, " + G[2] + ")
    " ;
    print P + "
    "
    print "该文法是Chomsky%d型文法" % flag;    
  • 相关阅读:
    一张图片入门Python
    4.1. 如何在Windows环境下开发Python
    你必须知道的EF知识和经验
    XUnit的使用
    如何使用NUnit
    Entity Framework 不支持DefaultValue
    Have You Ever Wondered About the Difference Between NOT NULL and DEFAULT?
    Validation failed for one or more entities. See 'EntityValidationErrors' property for more details
    Entity Framework 与多线程
    sqlite中的自增主键
  • 原文地址:https://www.cnblogs.com/waynelin/p/6111853.html
Copyright © 2011-2022 走看看