void CFParser :: saveScript(TokenInfo& token, _ScriptReader& reader, Rule& rule) { token.read(reader); while (!token.compare("=>") || token.state == dfaQuote) { token.writeLog(); token.read(reader); } }
void CFParser :: defineGrammarRule(TokenInfo& token, _ScriptReader& reader, Rule& rule) { // read: terminal [nonterminal] ; // read: nonterminal [nonterminal2] ; RuleType type = rtNormal; while (token.value[0] != ';' || token.state == dfaQuote) { if (token.state == dfaQuote) { if (rule.terminal) { rule.nonterminal = defineGrammarRule(token, reader); break; } else rule.terminal = writeBodyText(token.value); } else if (token.compare("<=")) { saveScript(token, reader, rule); } else if (token.state == dfaPrivate) { if (rule.terminal) { rule.nonterminal = defineGrammarRule(token, reader); break; } else { rule.prefixPtr = defineDSARule(token, reader); if (StringHelper::compare(token.value, LITERAL_KEYWORD)) { type = rtLiteral; } else if (StringHelper::compare(token.value, NUMERIC_KEYWORD)) { type = rtNumeric; } else if (StringHelper::compare(token.value, EPS_KEYWORD)) { type = rtEps; } else if (StringHelper::compare(token.value, EOF_KEYWORD)) { type = rtEof; } else if (StringHelper::compare(token.value, REFERENCE_KEYWORD)) { type = rtReference; } else if (StringHelper::compare(token.value, SCOPE_KEYWORD)) { type = rtScope; } else if (StringHelper::compare(token.value, IDLE_MAPPING_KEYWORD)) { type = rtNewIdleVariable; } else if (StringHelper::compare(token.value, VAR_KEYWORD)) { type = rtVariable; } else if (StringHelper::compare(token.value, MAPPING_KEYWORD)) { type = rtNewVariable; } // else if (ConstantIdentifier::compare(token.value, ANY_KEYWORD)) { // type = rtAny; // } else if (StringHelper::compare(token.value, IDENTIFIER_KEYWORD)) { type = rtIdentifier; } } } else if (token.state == dfaIdentifier) { if (rule.nonterminal == 0) { rule.prefixPtr = defineDSARule(token, reader); rule.nonterminal = mapRuleId(token.value); } else if (rule.terminal == 0) { type = rtChomski; rule.terminal = mapRuleId(token.value); } else { if (type == rtChomski) { rule.terminal = defineGrammarRule(token, reader, rule.terminal); } else rule.nonterminal = defineGrammarRule(token, reader, rule.nonterminal); break; } } token.read(reader); } rule.postfixPtr = defineDSARule(token, reader); defineApplyRule(rule, type); }