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)
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)
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)