/// <summary> /// 識別子を取り出す(要素名.属性名 もしくは 属性名のみ) /// </summary> /// <param name="origValue">取得元の文字列</param> /// <returns>トークン</returns> private BehaviorToken parseIdentifier(string origValue) { BehaviorToken retToken = new BehaviorToken(); // "." によって2つ以上に区切られた式の場合 Match matche = Regex.Match(origValue, @"[^\.]+\.[^\.]+"); if (matche.Success) { string[] splitted = origValue.Split(new string[] { "." }, StringSplitOptions.None); retToken.tokenType = TokenType.TOKEN_ELEMENT_NAME; retToken.token = splitted[0]; for (int i = 1; i < splitted.Length; i++) { addToken(retToken, ".", TokenType.TOKEN_OPER_DOT); addToken(retToken, splitted[i], TokenType.TOKEN_ATTRIBUTE_NAME); } return(retToken); } else { retToken.tokenType = TokenType.TOKEN_ATTRIBUTE_NAME; retToken.token = origValue; return(retToken); } }
/// <summary> /// 代入式の評価 /// </summary> /// <param name="origToken">材料のトークン</param> /// <returns></returns> private BehaviorToken evaluateAssignmentExpression(BehaviorToken origToken) { // 代入式の場合 if (origToken.token == STMT_TYPE_LET) { // left sideは Top の次 BehaviorToken lhsToken = origToken.NextToken; // right side は lhs の次の次 BehaviorToken rhsToken = lhsToken.NextToken.NextToken; // 変数名と思しき場所を、さらにパースする // 演算子 "." で区切られた文字列の場合は要素名と属性名に分ける // なおどのような場合でもメソッドには非対応 BehaviorToken lhsParsed = parseIdentifier(lhsToken.token); BehaviorToken rhsParsed = parseIdentifier(rhsToken.token); BehaviorToken retToken = new BehaviorToken(); retToken.token = "[let]"; addAllTokens(retToken, lhsParsed); addToken(retToken, "=", TokenType.TOKEN_OPER_EQUAL); addAllTokens(retToken, rhsParsed); addToken(retToken, ";", TokenType.TOKEN_SEMICOLON); } return(null); }
private BehaviorToken addAllTokens(BehaviorToken origToken, BehaviorToken appendToken) { BehaviorToken targetToken = origToken; while (targetToken.NextToken != null) { targetToken = targetToken.NextToken; } while (appendToken != null) { targetToken.NextToken = appendToken; appendToken = appendToken.NextToken; } return(targetToken); }
/// <summary> /// 引数からトークンを作成し、渡されたトークンの末尾に付与して返却する /// </summary> /// <param name="token"></param> /// <param name="content"></param> /// <param name="tokenTyp"></param> /// <returns></returns> private BehaviorToken addToken(BehaviorToken token, string content, TokenType tokenTyp) { BehaviorToken targetToken = token; while (targetToken.NextToken != null) { targetToken = targetToken.NextToken; } BehaviorToken appendToken = new BehaviorToken(); appendToken.token = content; appendToken.tokenType = tokenTyp; targetToken.NextToken = appendToken; return(targetToken); }
/// <summary> /// 指定された回数だけ先頭から次トークンを辿った結果を返却する /// (つまり、N個目のトークンを返す) /// </summary> /// <param name="firstToken"></param> /// <param name="times"></param> /// <returns></returns> private string getNumberedTokenValue(BehaviorToken firstToken, int times) { BehaviorToken p = firstToken; for (int i = 0; i < times; i++) { if (p.NextToken != null) { p = p.NextToken; } else { return(null); } } return(p.token); }
/// <summary> /// トークナイズを試みる(tryを付けているのはインプットのふるまいの記述ルールに /// 揺れがあり実効性が不明なため) /// </summary> /// <param name="c">ふるまいチャンク</param> /// <returns>取得されたトークン</returns> private BehaviorToken tryTokenize(BehaviorChunk c) { string origStr = c.behavior; string trimmedStr = getTrimmed(origStr); BehaviorToken tokenTop = new BehaviorToken(); Match matche; // 変数とかインスタンスを生成しつつ初期値をセットする matche = Regex.Match(trimmedStr, "(.*)を生成し、?(.*)を(セット|設定)する"); if (matche.Success) { tokenTop.token = STMT_TYPE_DEFINE; var g1 = matche.Groups[1]; var g2 = matche.Groups[2]; addToken(tokenTop, "var", TokenType.TOKEN_DECLARE_LABEL); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_INSTANCE_LABEL); addToken(tokenTop, "=", TokenType.TOKEN_OPER_EQUAL); addToken(tokenTop, g2.ToString(), TokenType.TOKEN_INSTANCE_LABEL); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // 型宣言と値代入を同時に行う場合 // 例: OPEN用フライト情報にフライト情報を生成してセットする matche = Regex.Match(trimmedStr, "(.*)に、?(.*)を、?生成してセットする"); if (matche.Success) { tokenTop.token = STMT_TYPE_DEFINE_WITH_TYPE; var g1 = matche.Groups[1]; var g2 = matche.Groups[2]; addToken(tokenTop, g2.ToString(), TokenType.TOKEN_INSTANCE_TYPE); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_INSTANCE_LABEL); addToken(tokenTop, "=", TokenType.TOKEN_OPER_EQUAL); addToken(tokenTop, g2.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // 変数とかインスタンスの生成(名前=型のやつ) matche = Regex.Match(trimmedStr, "(.*)を生成する"); if (matche.Success) { tokenTop.token = STMT_TYPE_DECLARE; var g1 = matche.Groups[1]; addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ELEMENT_NAME); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_INSTANCE_LABEL); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // メソッド呼び出しで戻り値を取らないパターン matche = Regex.Match(trimmedStr, "(.*)を呼び出す"); if (matche.Success) { tokenTop.token = STMT_TYPE_CALL_METHOD; var g1 = matche.Groups[1]; addToken(tokenTop, g1.ToString(), TokenType.TOKEN_METHOD_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // メソッド呼び出しで戻り値を取るパターン matche = Regex.Match(trimmedStr, "(.*)を呼び?出し、?(.*)(に戻り値)?を(セット|取得)する"); if (matche.Success) { tokenTop.token = STMT_TYPE_CALL_METHOD_TAKE_RETURN; var g1 = matche.Groups[1]; var g2 = matche.Groups[2]; addToken(tokenTop, g2.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, "=", TokenType.TOKEN_OPER_EQUAL); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // メソッド呼び出しで戻り値を取るパターン(別バージョン) // 日付操作ユーティリティ.日付分割処理(空席照会条件入力・空席照会検索条件.往路搭乗日,\n定数クラス.日付セパレートキー(年))を呼び出し、取得した分割搭乗年を(変数)搭乗年 にセットする。 matche = Regex.Match(trimmedStr, "(.*)を呼び?出し、?取得した(.*)を(.*)にセットする"); if (matche.Success) { tokenTop.token = tokenTop.token = STMT_TYPE_CALL_METHOD_TAKE_RETURN; var g1 = matche.Groups[1]; var g3 = matche.Groups[3]; addToken(tokenTop, g3.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, "=", TokenType.TOKEN_OPER_EQUAL); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // リターン文 // 例: 表示可能運賃存在フラグをリターンする。 matche = Regex.Match(trimmedStr, "(.*)をリターンする"); if (matche.Success) { tokenTop.token = STMT_TYPE_RETURN; var g1 = matche.Groups[1]; addToken(tokenTop, "return ", TokenType.TOKEN_RETURN); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // 型変換(Class Cast)を伴う代入式のパターン matche = Regex.Match(trimmedStr, "(.*)に、?(.*)に変換した(.*)を(セット|設定)(する|し)"); if (matche.Success) { tokenTop.token = STMT_TYPE_LET_WITH_CAST; var g1 = matche.Groups[1]; var g2 = matche.Groups[2]; var g3 = matche.Groups[3]; addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, "=", TokenType.TOKEN_OPER_EQUAL); addToken(tokenTop, "(", TokenType.TOKEN_PARENTHESIS_BEGIN); addToken(tokenTop, g2.ToString(), TokenType.TOKEN_ELEMENT_NAME); addToken(tokenTop, ")", TokenType.TOKEN_PARENTHESIS_END); addToken(tokenTop, g3.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // 代入式のパターン matche = Regex.Match(trimmedStr, "(.*)に、?(.*)を(セット|設定)(する|し)"); if (matche.Success) { tokenTop.token = STMT_TYPE_LET; var g1 = matche.Groups[1]; var g2 = matche.Groups[2]; addToken(tokenTop, g1.ToString(), TokenType.TOKEN_EXPR_IDENTIFIER); addToken(tokenTop, "=", TokenType.TOKEN_OPER_EQUAL); addToken(tokenTop, g2.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // 代入式のパターン(その2) ※ルール的にはダメなやつ matche = Regex.Match(trimmedStr, "(.*)を、?(.*)に(セット|設定)(する|し)"); if (matche.Success) { tokenTop.token = STMT_TYPE_LET; var g1 = matche.Groups[1]; var g2 = matche.Groups[2]; addToken(tokenTop, g2.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, "=", TokenType.TOKEN_OPER_EQUAL); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(evaluateAssignmentExpression(tokenTop)); } // if文の条件式のパターン(「~の場合」で文が終わる) matche = Regex.Match(trimmedStr, "(.*)の場合[。、]?\\s*$"); if (matche.Success) { tokenTop.token = STMT_TYPE_IF_COND; var g1 = matche.Groups[1]; addToken(tokenTop, "if", TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, "(", TokenType.TOKEN_PARENTHESIS_BEGIN); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ")", TokenType.TOKEN_PARENTHESIS_END); return(tokenTop); } // ループ // 例: フライト情報リストの要素数分ループし、以下の処理を繰り返す(ループカウンタ:i) matche = Regex.Match(trimmedStr, "(.*)の要素数分(ループし)?、*以下(の処理)?を繰り?返え?す。?\\(ループカウンタ[::](.*)\\)"); if (matche.Success) { tokenTop.token = STMT_TYPE_FOREACH_COLLECTION_W_INDEX; Group g1 = matche.Groups[1]; Group g2 = matche.Groups[4]; addToken(tokenTop, "for", TokenType.TOKEN_FOREACH); addToken(tokenTop, "(", TokenType.TOKEN_PARENTHESIS_BEGIN); addToken(tokenTop, "int", TokenType.TOKEN_INSTANCE_TYPE); addToken(tokenTop, g2.ToString(), TokenType.TOKEN_INSTANCE_LABEL); addToken(tokenTop, "=", TokenType.TOKEN_OPER_EQUAL); addToken(tokenTop, "0", TokenType.TOKEN_LITERAL); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); addToken(tokenTop, g2.ToString(), TokenType.TOKEN_INSTANCE_LABEL); addToken(tokenTop, "<", TokenType.TOKEN_OPER_LESSTHAN); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_COLLECTION_NAME); addToken(tokenTop, ".", TokenType.TOKEN_OPER_DOT); addToken(tokenTop, "Count", TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); addToken(tokenTop, g2.ToString(), TokenType.TOKEN_INSTANCE_LABEL); addToken(tokenTop, "++", TokenType.TOKEN_OPER_INCREMENT); addToken(tokenTop, ")", TokenType.TOKEN_PARENTHESIS_END); return(tokenTop); } // ループ // 例: フライト情報リストの要素数分ループし、以下の処理を繰り返す matche = Regex.Match(trimmedStr, "(.*)の要素数分(ループし)?、*以下の処理を繰り?返え?す"); if (matche.Success) { tokenTop.token = STMT_TYPE_FOREACH_COLLECTION; var g1 = matche.Groups[1]; addToken(tokenTop, "for", TokenType.TOKEN_FOREACH); addToken(tokenTop, "(", TokenType.TOKEN_PARENTHESIS_BEGIN); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_COLLECTION_NAME); addToken(tokenTop, ")", TokenType.TOKEN_PARENTHESIS_END); return(tokenTop); } // コレクションをなめるループをしている中で、コレクションから1要素を取り出す記述 // 合わせて、変数名などに「〇〇リスト」と名付けておくだけで // 「〇〇」という型のコレクションであるという宣言をしていることになるらしい。 // 例: フライト情報リスト(i)をフライト情報として取得する。 matche = Regex.Match(trimmedStr, "(.*)\\(([i-n])\\)を(.*)として取得する"); if (matche.Success) { tokenTop.token = STMT_TYPE_FOREACH_PICKUP; var g1 = matche.Groups[1]; var g2 = matche.Groups[2]; var g3 = matche.Groups[3]; addToken(tokenTop, g3.ToString(), TokenType.TOKEN_COLLECTION_NAME); addToken(tokenTop, "=", TokenType.TOKEN_OPER_EQUAL); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_COLLECTION_NAME); addToken(tokenTop, "[", TokenType.TOKEN_PARENTHESIS_BEGIN); addToken(tokenTop, g2.ToString(), TokenType.TOKEN_COLLECTION_NAME); addToken(tokenTop, "]", TokenType.TOKEN_PARENTHESIS_END); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // break(ループを抜ける) // ループを抜ける。 matche = Regex.Match(trimmedStr, "ループを抜ける"); if (matche.Success) { tokenTop.token = STMT_TYPE_LOOP_BREAK; addToken(tokenTop, "break", TokenType.TOKEN_BREAK); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // continue(ループの先頭に戻る) // ループの先頭に戻る。 matche = Regex.Match(trimmedStr, "ループの先頭に戻る"); if (matche.Success) { tokenTop.token = STMT_TYPE_LOOP_CONTINUE; addToken(tokenTop, "continue", TokenType.TOKEN_CONTINUE); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // メソッド呼び出しで戻り値を取らないパターン(別パターン) // 単にメソッド名だけを書いた文章は、そのメソッドを呼び出し戻り値は無視する、という意味になるらしい。 matche = Regex.Match(trimmedStr, "(.*)\\((.*)\\)$"); if (matche.Success) { tokenTop.token = STMT_TYPE_CALL_METHOD; var g1 = matche.Groups[1]; var g2 = matche.Groups[2]; addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, "(", TokenType.TOKEN_PARENTHESIS_BEGIN); addToken(tokenTop, g2.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ")", TokenType.TOKEN_PARENTHESIS_END); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // それ以外はコメント扱いとしてそのまま出力 tokenTop.token = STMT_TYPE_COMMENT; addToken(tokenTop, trimmedStr, TokenType.TOKEN_COMMENT); return(tokenTop); // return null; }
private BehaviorToken tryTokenize(BehaviorChunk c) { string origStr = c.behavior; string trimmedStr = getTrimmed(origStr); BehaviorToken tokenTop = new BehaviorToken(); Match matche; // 変数とかインスタンスを生成しつつ初期値をセットする matche = Regex.Match(trimmedStr, "(.*)を生成し、?(.*)を(セット|設定)する"); if (matche.Success) { tokenTop.token = "[define]"; var g1 = matche.Groups[1]; var g2 = matche.Groups[2]; addToken(tokenTop, "var", TokenType.TOKEN_DECLARE_LABEL); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_INSTANCE_LABEL); addToken(tokenTop, "=", TokenType.TOKEN_EQUAL); addToken(tokenTop, g2.ToString(), TokenType.TOKEN_INSTANCE_LABEL); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // 型宣言と値代入を同時に行う場合 // 例: OPEN用フライト情報にフライト情報を生成してセットする matche = Regex.Match(trimmedStr, "(.*)に、?(.*)を、?生成してセットする"); if (matche.Success) { tokenTop.token = "[define-with-type]"; var g1 = matche.Groups[1]; var g2 = matche.Groups[2]; addToken(tokenTop, g2.ToString(), TokenType.TOKEN_INSTANCE_TYPE); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_INSTANCE_LABEL); addToken(tokenTop, "=", TokenType.TOKEN_EQUAL); addToken(tokenTop, g2.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // 変数とかインスタンスの生成(名前=型のやつ) matche = Regex.Match(trimmedStr, "(.*)を生成する"); if (matche.Success) { tokenTop.token = "[declare]"; var g1 = matche.Groups[1]; addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ELEMENT_NAME); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_INSTANCE_LABEL); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // メソッド呼び出しで戻り値を取らないパターン matche = Regex.Match(trimmedStr, "(.*)を呼び出す"); if (matche.Success) { tokenTop.token = "[call]"; var g1 = matche.Groups[1]; addToken(tokenTop, g1.ToString(), TokenType.TOKEN_METHOD_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // メソッド呼び出しで戻り値を取るパターン matche = Regex.Match(trimmedStr, "(.*)を呼び?出し、?(.*)(に戻り値)?を(セット|取得)する"); if (matche.Success) { tokenTop.token = "[receive_response]"; var g1 = matche.Groups[1]; var g2 = matche.Groups[2]; addToken(tokenTop, g2.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, "=", TokenType.TOKEN_EQUAL); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // リターン文 // 例: 表示可能運賃存在フラグをリターンする。 matche = Regex.Match(trimmedStr, "(.*)をリターンする"); if (matche.Success) { tokenTop.token = "[return]"; var g1 = matche.Groups[1]; addToken(tokenTop, "return ", TokenType.TOKEN_RETURN); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // 型変換を伴う代入式のパターン matche = Regex.Match(trimmedStr, "(.*)に、?(.*)に変換した(.*)を(セット|設定)(する|し)"); if (matche.Success) { tokenTop.token = "[let_with_conv]"; var g1 = matche.Groups[1]; var g2 = matche.Groups[2]; var g3 = matche.Groups[3]; addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, "=", TokenType.TOKEN_EQUAL); addToken(tokenTop, "(", TokenType.TOKEN_PARENTHESIS_BEGIN); addToken(tokenTop, g2.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ")", TokenType.TOKEN_PARENTHESIS_END); addToken(tokenTop, g3.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // 代入式のパターン matche = Regex.Match(trimmedStr, "(.*)に、?(.*)を(セット|設定)(する|し)"); if (matche.Success) { tokenTop.token = "[let]"; var g1 = matche.Groups[1]; var g2 = matche.Groups[2]; addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, "=", TokenType.TOKEN_EQUAL); addToken(tokenTop, g2.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // if文の条件式のパターン(「~の場合」で文が終わる) matche = Regex.Match(trimmedStr, "(.*)の場合[。、]?\\s*$"); if (matche.Success) { tokenTop.token = "[if-cond]"; var g1 = matche.Groups[1]; addToken(tokenTop, "if", TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, "(", TokenType.TOKEN_PARENTHESIS_BEGIN); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_ATTRIBUTE_NAME); addToken(tokenTop, ")", TokenType.TOKEN_PARENTHESIS_END); return(tokenTop); } // ループ // 例: フライト情報リストの要素数分ループし、以下の処理を繰り返す(ループカウンタ:i) matche = Regex.Match(trimmedStr, "(.*)の要素数分(ループし)?、*以下の処理を繰り?返え?す。?\\(ループカウンタ:(.*)\\)"); if (matche.Success) { tokenTop.token = "[foreach-collection]"; Group g1 = matche.Groups[1]; Group g2; if (matche.Groups[2].ToString() == "ループし") { g2 = matche.Groups[3]; } else { g2 = matche.Groups[2]; } addToken(tokenTop, "for", TokenType.TOKEN_FOREACH); addToken(tokenTop, "(", TokenType.TOKEN_PARENTHESIS_BEGIN); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_COLLECTION_NAME); addToken(tokenTop, ")", TokenType.TOKEN_PARENTHESIS_END); return(tokenTop); } // ループ // 例: フライト情報リストの要素数分ループし、以下の処理を繰り返す matche = Regex.Match(trimmedStr, "(.*)の要素数分(ループし)?、*以下の処理を繰り?返え?す"); if (matche.Success) { tokenTop.token = "[foreach-collection]"; var g1 = matche.Groups[1]; addToken(tokenTop, "for", TokenType.TOKEN_FOREACH); addToken(tokenTop, "(", TokenType.TOKEN_PARENTHESIS_BEGIN); addToken(tokenTop, g1.ToString(), TokenType.TOKEN_COLLECTION_NAME); addToken(tokenTop, ")", TokenType.TOKEN_PARENTHESIS_END); return(tokenTop); } // break(ループを抜ける) // ループを抜ける。 matche = Regex.Match(trimmedStr, "ループを抜ける"); if (matche.Success) { tokenTop.token = "[loop-break]"; addToken(tokenTop, "break", TokenType.TOKEN_BREAK); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } // continue(ループの先頭に戻る) // ループの先頭に戻る。 matche = Regex.Match(trimmedStr, "ループの先頭に戻る"); if (matche.Success) { tokenTop.token = "[loop-continue]"; addToken(tokenTop, "continue", TokenType.TOKEN_CONTINUE); addToken(tokenTop, ";", TokenType.TOKEN_SEMICOLON); return(tokenTop); } return(null); }
/// <summary> /// /// </summary> /// <param name="methods"></param> private List <MethodCallingInfo> searchForMethodLinks(MethodVO mth, SQLiteConnection conn, BehaviorParser parser) { List <BehaviorChunk> chunks = readBehaviorChunks(conn, mth.methodId); List <BehaviorChunk> tokenizedChunks = parser.tokenizeChunk(chunks); List <MethodCallingInfo> retCallingInfos = new List <MethodCallingInfo>(); Console.WriteLine("■■MethodID:" + mth.methodId); foreach (BehaviorChunk tchk in tokenizedChunks) { MethodVO hitMethod = null; Console.Write(tchk.dottedNum + " "); if (tchk.behaviorToken != null) { Console.Write(tchk.behaviorToken.token + tchk.behavior); BehaviorToken tkn = tchk.behaviorToken; // 最初のトークン(命令タイプ識別子)による判断分岐 switch (tkn.token) { // call-method 文なら case BehaviorParser.STMT_TYPE_CALL_METHOD: hitMethod = tryGetMethodIdFromCandidateString(getNumberedTokenValue(tkn, 1), mth.elementId); break; // call-method-take-return 文なら case BehaviorParser.STMT_TYPE_CALL_METHOD_TAKE_RETURN: hitMethod = tryGetMethodIdFromCandidateString(getNumberedTokenValue(tkn, 3), mth.elementId); break; // let 文なら case BehaviorParser.STMT_TYPE_LET: hitMethod = tryGetMethodIdFromCandidateString(getNumberedTokenValue(tkn, 1), mth.elementId); if (hitMethod == null) { hitMethod = tryGetMethodIdFromCandidateString(getNumberedTokenValue(tkn, 3), mth.elementId); } break; // let-with-cast 文なら case BehaviorParser.STMT_TYPE_LET_WITH_CAST: hitMethod = tryGetMethodIdFromCandidateString(getNumberedTokenValue(tkn, 6), mth.elementId); break; } } else { Console.Write("[cant-tokenize]" + tchk.behavior); } // if (hitMethod != null) { MethodCallingInfo ci = new MethodCallingInfo(); ci.chunkId = tchk.chunkId; ci.methodId = mth.methodId; ci.row = tchk.pos; ci.matchedChunk = tchk.behavior; ci.destMethodId = hitMethod.methodId; retCallingInfos.Add(ci); Console.WriteLine("\t" + hitMethod.name); } else { Console.WriteLine(""); } } return(retCallingInfos); }