NFA RE2NFA::parseAtom() { // #### switch (next()) { case TOK_STRING: return createCharNFA(); case TOK_LPAREN: { NFA subExpr = parseExpr(); next(TOK_RPAREN); return subExpr; } case TOK_LBRACE: { QString macroName = lexemUntil(TOK_RBRACE); QMap<QString, NFA>::ConstIterator macro = macros.find(macroName); if (macro == macros.end()) { qWarning("Unknown macro '%s' - probably used before defined", qPrintable(macroName)); return NFA(); } return *macro; } case TOK_LBRACKET: { NFA set = parseSet(); next(TOK_RBRACKET); return set; } case TOK_SEQUENCE: return parseSet2(); case TOK_DOT: return NFA::createSetNFA(maxInputSet); default: prev(); return NFA(); } }
int main() { NFA a = NFA('a'); NFA b = NFA('b'); NFA x = NFA('b'); x = x + b + a + *(b|a); x.show(); return 0; }
NFA RE2NFA::parseMaybeQuantifier(const NFA &nfa) { // #### switch (next()) { case TOK_STAR: return NFA::createOptionalNFA(nfa); case TOK_QUESTION: return NFA::createZeroOrOneNFA(nfa); case TOK_PLUS: return NFA::createConcatenatingNFA(nfa, NFA::createOptionalNFA(nfa)); case TOK_LBRACE: { const int rewind = index - 1; QString lexemBeforeComma; QString lexemAfterComma; bool seenComma = false; forever { if (test(TOK_COMMA)) { if (seenComma) { errorColumn = symbol().column; return NFA(); } seenComma = true; } else if (test(TOK_RBRACE)) { break; } else { next(TOK_STRING); if (seenComma) lexemAfterComma += symbol().lexem; else lexemBeforeComma += symbol().lexem; } } bool isNumber = false; int min = lexemBeforeComma.toInt(&isNumber); if (!isNumber) { index = rewind; return nfa; } int max = min; if (seenComma) { max = lexemAfterComma.toInt(&isNumber); if (!isNumber) { errorColumn = symbol().column; return NFA(); } } return NFA::applyQuantity(nfa, min, max); } default: prev(); return nfa; } }
NFA RE2NFA::parse(const QString &expression, int *errCol) { tokenize(expression); if (symbols.isEmpty()) return NFA(); index = 0; NFA result = parseExpr(); if (result.isEmpty()) { if (errCol) *errCol = errorColumn; } return result; }
int MaxMeaningfulClustering::nfa(float sigma, float sigma2, int k, int N) { return -1*(int)NFA( N, k, (double) sigma, 0); //this uses an approximation for the nfa calculations (faster) }