public static bool Read(ContextCompiler cc, out ContextCommand contextcmd) { contextcmd = new ContextCommand(); AbstractWordReader wreader = cc.wreader; start: if (wreader.CurrentType == WordType.Invalid) { return(false); } string word = wreader.CurrentWord; if (wreader.CurrentType != WordType.Identifier) { if (word == ";" || word == "}") { return(false); } throw new System.ApplicationException("Fatal: ここに制御は来る筈ない。ContextWordReader の実装が怪しい"); } // argument があればそれを読み取り。 wreader.LetterReader.CopyPosition(0, contextcmd); // 後でエラーが発生した時等の為。 wreader.LetterReader.CopyPosition(0, 1); // * wreader.LetterReader.StoreCurrentPos(2); // * if (wreader.ReadNext()) { if (wreader.CurrentType == WordType.Suffix) { contextcmd.argument = wreader.CurrentWord; wreader.LetterReader.StoreCurrentPos(2); // * wreader.ReadNext(); // 二重引数を跳ばし読み if (wreader.CurrentType == WordType.Suffix) { wreader.LetterReader.SetError("二重に引数を指定する事は出来ません。", 0, null); } while (wreader.CurrentType == WordType.Suffix) { wreader.ReadNext(); } } } // command が処理可能な物かどうかを確認。 if (!cc.cmdreg.ContainsKey(word)) { cc.wreader.LetterReader.SetError(word + " という種類の命令は定義されていません", 1, 2); // * goto start; // 読み直し } contextcmd.command = word; return(true); }
public static bool Read(ContextCompiler cc, out UserCommand usercmd) { usercmd = new UserCommand(); AbstractWordReader wreader = cc.wreader; // command while (wreader.CurrentType != WordType.Identifier || wreader.CurrentWord != "command") { wreader.LetterReader.SetError("command の開始には keyword 'command' が必要です。", 0, null); if (!wreader.ReadNext()) { return(false); } } wreader.ReadNext(); // CommandName while (wreader.CurrentType != WordType.Identifier) { wreader.LetterReader.SetError("keyword 'context' の後には識別子が必要です。", 0, null); if (!wreader.ReadNext()) { return(false); } } usercmd.name = wreader.CurrentWord; wreader.ReadNext(); // {} while (wreader.CurrentType != WordType.Literal) { wreader.LetterReader.SetError("command 宣言の後には command の中身が必要です。中身は { で始めて下さい。", 0, null); if (!wreader.ReadNext()) { return(false); } } usercmd.content = FormatSource(wreader.CurrentWord); wreader.ReadNext(); return(true); }