void BuildVocabWords([CanBeNull] ITableBuilder longWordTable, [CanBeNull] out Queue <IWord> longWords) { // build vocabulary longWords = longWordTable == null ? null : new Queue <IWord>(); var helpers = new WriteToBuilderHelpers { CompileConstantDelegate = CompileConstant, DirIndexToPropertyOperandDelegate = di => { Debug.Assert(di < Context.ZEnvironment.Directions.Count); var dir = Context.ZEnvironment.Directions[di]; return(Properties[dir]); } }; var builtWords = new HashSet <IWordBuilder>(); foreach (var pair in Vocabulary) { var word = pair.Key; var wb = pair.Value; if (builtWords.Contains(wb)) { continue; } builtWords.Add(wb); Context.ZEnvironment.VocabFormat.WriteToBuilder(word, wb, helpers); if (longWords != null && Context.ZEnvironment.IsLongWord(word)) { longWords.Enqueue(word); } } }
public void WriteToBuilder(IWord word, IWordBuilder wb, WriteToBuilderHelpers helpers) { var zversion = ctx.ZEnvironment.ZVersion; var nw = (NewParserWord)word; bool needSemanticStuff = false; if (zversion >= 4) { if (nw.HasClass(dirClass)) { ConditionalAddByte(wb, word.Atom.Text, helpers.CompileConstant, nw.DirId); wb.AddByte(0); } else if (!nw.HasClass(verbClass)) { ConditionalAddShort(wb, word.Atom.Text, helpers.CompileConstant, nw.SemanticStuff); } else { needSemanticStuff = true; } } else { bool adj = nw.HasClass(adjClass), dir = nw.HasClass(dirClass); if (adj || dir) { if (adj) { ConditionalAddByte(wb, word.Atom.Text, helpers.CompileConstant, nw.AdjId); } else { wb.AddByte(0); } if (dir) { ConditionalAddByte(wb, word.Atom.Text, helpers.CompileConstant, nw.DirId); } else { wb.AddByte(0); } } else { ConditionalAddShort(wb, word.Atom.Text, helpers.CompileConstant, nw.SemanticStuff); } } bool verbed = false; if (nw.HasClass(verbClass)) { var verbStuff = nw.VerbStuff; ZilObject verbStuffId; if ((IsVerbPointer(verbStuff) && (verbStuffId = verbStuff.GetPrimitive(ctx)) != null) || TryGetVerbStuffId(verbStuff, out verbStuffId)) { if (verbStuffId.StdTypeAtom == StdAtom.VWORD) { verbStuffId = NewParserWord.FromVword(ctx, (ZilHash)verbStuffId).Atom; } var actTableAtom = ZilAtom.Parse("ACT?" + ((ZilAtom)verbStuffId).Text, ctx); var actConstant = helpers.CompileConstant(actTableAtom); Debug.Assert(actConstant != null); wb.AddShort(actConstant); verbed = true; } } if (!verbed) { if (zversion == 3) { wb.AddShort(0); } else if (needSemanticStuff) { ConditionalAddShort(wb, word.Atom.Text, helpers.CompileConstant, nw.SemanticStuff); } } if (!ctx.GetCompilationFlagOption(StdAtom.WORD_FLAGS_IN_TABLE)) { wb.AddShort((short)nw.Flags); } if (ctx.GetCompilationFlagOption(StdAtom.ONE_BYTE_PARTS_OF_SPEECH)) { var lowByte = (byte)(nw.Classification & 0x7f); var highByte = (byte)((nw.Classification >> 7) & 0x7f); if (lowByte != 0 && highByte != 0) { ctx.HandleError(new CompilerError(CompilerMessages.ONEBYTEPARTSOFSPEECH_Loses_Data_For_0, word.Atom.Text)); } if (highByte != 0) { wb.AddByte((byte)(highByte | 0x80)); } else { wb.AddByte(lowByte); } } else { wb.AddShort((short)nw.Classification); } }
public void WriteToBuilder(IWord word, IWordBuilder wb, WriteToBuilderHelpers helpers) { ((OldParserWord)word).WriteToBuilder(ctx, wb, helpers.DirIndexToPropertyOperand); }