コード例 #1
0
        IEnumerable <HelperMethod> ExtractDistinctCompressionMethods(ElementSizeStrategy sizeStrategy)
        {
            var result = new List <HelperMethod>();

            foreach (var data in _stateData)
            {
                var resourceName = _config.Tables[data.TableID].Name;

                foreach (var method in HelperMethod.GetDecompressionMethods(data.TransitionTable.Method, sizeStrategy, !string.IsNullOrEmpty(resourceName)))
                {
                    if (!result.Contains(method))
                    {
                        result.Add(method);
                    }
                }
            }

            return(result);
        }
コード例 #2
0
        void WriteParserClass(TextWriter writer)
        {
            var size = ElementSizeStrategy.Get(_config.Manager.ElementSize);

            writer.Write("	");
            writer.Write(_config.Manager.Visibility == ClassVisibility.Public ? "public" : "internal");
            writer.Write(" abstract class ");
            writer.WriteLine(_config.Manager.ParserName);
            writer.WriteLine("	{");

            if (_data.NeedsTerminalMask)
            {
                writer.Write("		const ");
                writer.Write(_config.Manager.TypeName);
                writer.Write(" ColumnMask = (");
                writer.Write(_config.Manager.TypeName);
                writer.Write(")");
                writer.Write(_data.TerminalMask);
                writer.WriteLine(";");
                writer.WriteLine();
            }

            WriteStatistics(writer, _data.Statistics, size);

            WriteParserConstructor(writer);
            writer.WriteLine();

            if (_config.Manager.Trace)
            {
                WriteTraceProperty(writer);
                writer.WriteLine();
            }

            foreach (var entryPoint in _config.EntryPoints)
            {
                WriteParseMethod(writer, entryPoint, _config.EntryPoints.Count != 1);
                writer.WriteLine();
            }

            WriteParseMethod(writer);
            writer.WriteLine();
            WriteReductionMethod(writer);
            writer.WriteLine();

            if (!_config.UseErrorRecovery)
            {
                WriteUnexpectedTokenMethod(writer);
            }
            else
            {
                WriteReduceErrorMethod(writer);
                writer.WriteLine();
                WriteCanBeFollowedBy(writer);
            }

            writer.WriteLine();

            foreach (var method in HelperMethod.GetDecompressionMethods(_data.Actions.Method, size, !string.IsNullOrEmpty(_config.TableResourceName)))
            {
                method.Write(writer, 2);
                writer.WriteLine();
            }

            writer.Write("		protected abstract ");
            writer.Write(_config.Manager.TypeName);
            writer.Write(" GetTokenType(Type_");
            writer.Write(_config.TerminalType.Label.Text);
            writer.WriteLine(" terminal);");
            writer.WriteLine();

            foreach (var method in GetAbstractMethods(_config))
            {
                WriteReductionMethod(writer, method);
            }

            if (_config.Manager.Trace)
            {
                writer.WriteLine();
                WriteTraceMethod(writer);
                writer.WriteLine();
                WriteReductionStringMethod(writer);
            }

            writer.WriteLine();
            WriteFields(writer, size);
            writer.WriteLine();
            WriteStateStruct(writer);
            writer.WriteLine();
            WriteTableCacheMembers(writer);
            writer.WriteLine("	}");
        }