示例#1
0
def nfaSyntactic():
    nfaForm = forms.NFASyn(request.form)
    nfas = set([])
    dfaER = None
    msg = None
    if request.method == 'POST':
        regularExpressions = nfaForm.regularExpressions.data
        regularExpressions = regularExpressions.split('\r\n')
        print(regularExpressions)
        try:
            for re in regularExpressions:
                auxRE = re.split(' ')
                lex = Lexer(syntacticDFA, auxRE[0])
                syn = SyntacticNFA(lex)
                nfaAux = syn.start()
                if (nfaAux == None):
                    print('Error')
                    msg = 2
                    break
                nfaAux.setToken(int(auxRE[1]))
                nfas.add(nfaAux)

            if (msg != 2):
                nfaER = NFA.specialJoin(nfas)
                dfaER = nfaER.convertToDFA()
                dfaDictionary[dfaER.getId()] = dfaER
                msg = 1
        except:
            msg = 2
    NFA.resetId()
    DFA.resetId()
    return render_template('analysis/nfa.html',
                           nfaF=nfaForm,
                           dfaER=dfaER,
                           msg=msg)
示例#2
0
def lalr():
    lalrForm = forms.LALR(request.form)
    relationsTable = None
    analysisTable = None
    grammar = None
    msg = None
    msgS = None
    rules = ""
    if request.method == 'POST':
        string = lalrForm.string.data
        grammarForm = lalrForm.grammar.data

        stringAux = grammarForm.split('\r\n')
        for s in stringAux:
            rules += s

        print("\nAnalizando cadena: " + string)
        lex = Lexer(grammarDFA, rules)
        print("Lexico OK. Analizando sintacticamente...")

        syn = SyntacticGrammar(lex)
        print("\nGramatica construida: ")

        grammar = syn.start()
        if (grammar):
            print("Gramatica valida")
            msg = 5
            for r in grammar:
                r.displayRule()

            #Analysis
            print("\nAnalisis LALR")
            lex2 = Lexer(stringDFA, string)  #Lexic for numbers in string
            #lex2.display()
            lalr = LALR(grammar, lex2)

            if (lalr.isLALR()):
                print("Gramatica compatible con LALR")
                msg = 1
            else:
                print("\nERROR. La gramatica no es compatible con LALR")
                msg = 2

            lalr.displayTable(0)
            relationsTable = lalr.getTable()

            if (string != ""):
                res = lalr.analyze(string)
                lalr.displayTable(1)
                analysisTable = lalr.getAnalysisTable()

                if (res):
                    print("\n" + string + " pertenece a la gramatica")
                    msgS = 1
                else:
                    print("\n" + string + " no pertenece a la gramatica")
                    msgS = 2
        else:
            print("Gramatica no valida")
            msg = 3
    NFA.resetId()
    DFA.resetId()
    return render_template('analysis/lalr.html',
                           lalr=lalrForm,
                           grammar=grammar,
                           relationsTable=relationsTable,
                           analysisTable=analysisTable,
                           msg=msg,
                           msgS=msgS)
示例#3
0
def ll1():
    llForm = forms.LL1(request.form)
    relationsTable = None
    analysisTable = None
    grammar = None
    msg = None
    msgS = None
    rules = ""
    if request.method == 'POST':
        string = llForm.string.data
        grammarForm = llForm.grammar.data

        stringAux = grammarForm.split('\r\n')
        for s in stringAux:
            rules += s

        print("\nAnalizando cadena: " + string)
        lex = Lexer(grammarDFA, rules)
        print("Lexico OK. Analizando sintacticamente...")

        syn = SyntacticGrammar(lex)
        print("\nGramatica construida: ")

        grammar = syn.start()
        if (grammar):
            print("Gramatica valida")
            msg = 5

            for r in grammar:
                r.displayRule()
                if (r.isLeftRecursive()):
                    print("La gramatica es recursiva por la izquierda")
                    msg = 4
                    break
            if (msg != 4):
                #Analysis
                print("\nAnalisis LL(1)")
                lex2 = Lexer(stringDFA, string)  #Lexic for numbers in string
                ll1 = LL1(grammar, lex2)
                if (msg != 4):
                    if (ll1.isLL1()):
                        print("Gramatica compatible con LL(1)")
                        msg = 1
                    else:
                        print(
                            "\nERROR. La gramatica no es compatible con LL(1)")
                        msg = 2

                    ll1.displayTable(0)
                    relationsTable = ll1.getTable()

                    if (string != ""):
                        res = ll1.analyze(string)
                        ll1.displayTable(1)
                        analysisTable = ll1.getAnalysisTable()

                        if (res):
                            print("\n" + string + " pertenece a la gramatica")
                            msgS = 1
                        else:
                            print("\n" + string +
                                  " no pertenece a la gramatica")
                            msgS = 2
        else:
            print("Gramatica no valida")
            msg = 3
    NFA.resetId()
    DFA.resetId()
    return render_template('analysis/ll1.html',
                           ll1=llForm,
                           grammar=grammar,
                           relationsTable=relationsTable,
                           analysisTable=analysisTable,
                           msg=msg,
                           msgS=msgS)