public void AddPassage(Passage passage) { if (_passageContentMacroStack.Count != 0) { Logger.LogWarning("A macro isn´t closed before passage " + passage.Name + " begins"); } _passageContentMacroStack.Clear(); _lastPassageContent = null; _currentPassage = passage; _currentFormat = new PassageContentFormat(); _tree.AddPassage(passage); }
private List<ZInstruction> ConvertMacros(PassageContent content, ref int currentLink, List<Tuple<string, Assign>> links, string currentPassage) { List<ZInstruction> instructions = new List<ZInstruction>(); PassageMacroSet setMacro = content as PassageMacroSet; PassageMacroBranch branchMacro = content as PassageMacroBranch; PassageMacroPrint printMacro = content as PassageMacroPrint; PassageMacroDisplay displayMacro = content as PassageMacroDisplay; if (setMacro != null) { instructions.AddRange(ConvertAssignExpression((Assign)setMacro.Expression, currentPassage)); } else if (printMacro != null) { if (printMacro.Expression is StringValue) instructions.AddRange(StringToInstructions(((StringValue)(printMacro.Expression)).Value.Replace('\"', ' ').Trim())); else { instructions.AddRange(ConvertValueExpression(printMacro.Expression, currentPassage)); instructions.Add(new PrintNum(new ZStackVariable())); } } else if (displayMacro != null) { instructions.AddRange(ConvertPassageContent(_passages.Single(passage => passage.Name == ((StringValue)(displayMacro.Expression)).Value.Replace('\"', ' ').Trim()).PassageContentList, ref currentLink, links, currentPassage)); } else if (branchMacro != null) { Guid endIfGuid = Guid.NewGuid(); string endIf = "endIf_" + endIfGuid; //if PassageMacroIf ifMacro = (PassageMacroIf)branchMacro.BranchNodeList.First(); Guid ifGuid = Guid.NewGuid(); string ifTrue = "if_True_" + ifGuid; string ifFalse = "if_False_" + ifGuid; instructions.AddRange(ConvertBranchExpression(ifMacro.Expression, ifTrue, ifFalse, currentPassage)); // if expression is true instructions.Add(new Nop() { Label = new ZLabel(ifTrue) }); foreach (var instruction in ConvertPassageContent(ifMacro.PassageContentList, ref currentLink, links, currentPassage)) { instructions.Add(instruction); } instructions.Add(new Jump(new ZJumpLabel(endIf))); // if expression is false instructions.Add(new Nop() { Label = new ZLabel(ifFalse) }); //else if foreach (PassageMacroElseIf elseIfMacro in branchMacro.BranchNodeList.OfType<PassageMacroElseIf>()) { Guid elseIfGuid = Guid.NewGuid(); string elseIfTrue = "elseIf_True_" + elseIfGuid; string elseIfFalse = "elseIf_False_" + elseIfGuid; instructions.AddRange(ConvertBranchExpression(elseIfMacro.Expression, elseIfTrue, elseIfFalse, currentPassage)); // if expression is true instructions.Add(new Nop() { Label = new ZLabel(elseIfTrue) }); foreach (var instruction in ConvertPassageContent(elseIfMacro.PassageContentList, ref currentLink, links, currentPassage)) { instructions.Add(instruction); } instructions.Add(new Jump(new ZJumpLabel(endIf))); // if expression is false instructions.Add(new Nop() { Label = new ZLabel(elseIfFalse) }); } //else PassageMacroElse elseMacro = branchMacro.BranchNodeList.Last() as PassageMacroElse; if (elseMacro != null) { foreach (var instruction in ConvertPassageContent(elseMacro.PassageContentList, ref currentLink, links, currentPassage)) { instructions.Add(instruction); } } //endif instructions.Add(new Nop() { Label = new ZLabel(endIf) }); } else { throw new NotSupportedException("This macro is not supported yet: " + content.GetType().Name); } return instructions; }
public void AddPassageContent(PassageContent passageContent) { // set format passageContent.ContentFormat = _currentFormat; _currentFormat = _currentFormat.Copy(); PassageContent lastContent = _lastPassageContent; // merge text content together if (lastContent != null && lastContent.Type == PassageContent.ContentType.TextContent && passageContent.Type == PassageContent.ContentType.TextContent && CurrentFormat.euquals(lastContent.ContentFormat)) { lastContent.PassageText.MergePassageText(passageContent.PassageText); passageContent = lastContent; } else if (MacroStackCount == 0) { _currentPassage.AddPassageContent(passageContent); } else if (lastContent.Type == PassageContent.ContentType.MacroContent && lastContent.PassageMacro.MacroType == PassageMacro.PassageMarcroType.BranchMacro) { PassageMacro macro = _passageContentMacroStack.Last().PassageMacro; PassageMacroBranch branch = macro.PassageMacroBranch; branch.AddBranch(passageContent.PassageBranch); _passageContentMacroStack.Add(passageContent); } // stack: macro branch if - input: else ifelse else if (_passageContentMacroStack[_passageContentMacroStack.Count - 2].Type == PassageContent.ContentType.MacroContent && _passageContentMacroStack[_passageContentMacroStack.Count - 2].PassageMacro.MacroType == PassageMacro.PassageMarcroType.BranchMacro && _passageContentMacroStack.Last().Type == PassageContent.ContentType.BranchContent && _passageContentMacroStack.Last().PassageBranch.BranchType != PassageMacroBranchNode.MacroBranchType.Else && passageContent.Type == PassageContent.ContentType.BranchContent && passageContent.PassageBranch.BranchType != PassageMacroBranchNode.MacroBranchType.If) { FinishBranchStatement(); PassageMacroBranch branch = _passageContentMacroStack.Last().PassageMacro.PassageMacroBranch; branch.AddBranch(passageContent.PassageBranch); _passageContentMacroStack.Add(passageContent); } else if (_passageContentMacroStack.Last().Type == PassageContent.ContentType.BranchContent) { PassageMacroBranchNode branchNode = _passageContentMacroStack.Last().PassageBranch; branchNode.AddPassageContent(passageContent); } else { throw new Exception("unknown case"); } // put on stack if macro branch if (passageContent.Type == PassageContent.ContentType.MacroContent && passageContent.PassageMacro.MacroType == PassageMacro.PassageMarcroType.BranchMacro) { _passageContentMacroStack.Add(passageContent); } _lastPassageContent = passageContent; }
private void FinishBranchStatement() { _passageContentMacroStack.RemoveAt(_passageContentMacroStack.Count - 1); if (_passageContentMacroStack.Count == 0) { _lastPassageContent = _currentPassage.PassageContentList.Last(); _currentFormat = _lastPassageContent.ContentFormat.Copy(); } else { _lastPassageContent = _passageContentMacroStack.Last(); _currentFormat = _lastPassageContent.ContentFormat.Copy(); } }