private void ParseArguments(IList <string> tmpReasons)
        {
            bool doHelp = Arguments.Count == 0;

            InputFiles = new List <string>();
            CSharpFileOptions.Builder            builder = FileOptions.ToBuilder();
            Dictionary <string, FieldDescriptor> fields  =
                new Dictionary <string, FieldDescriptor>(StringComparer.OrdinalIgnoreCase);

            foreach (FieldDescriptor fld in builder.DescriptorForType.Fields)
            {
                fields.Add(fld.Name, fld);
            }

            foreach (string argument in Arguments)
            {
                if (StringComparer.OrdinalIgnoreCase.Equals("-help", argument) ||
                    StringComparer.OrdinalIgnoreCase.Equals("/help", argument) ||
                    StringComparer.OrdinalIgnoreCase.Equals("-?", argument) ||
                    StringComparer.OrdinalIgnoreCase.Equals("/?", argument))
                {
                    doHelp = true;
                    break;
                }

                Match m = ArgMatch.Match(argument);
                if (m.Success)
                {
                    FieldDescriptor fld;
                    string          name  = m.Groups["name"].Value;
                    string          value = m.Groups["value"].Value;

                    if (fields.TryGetValue(name, out fld))
                    {
                        object obj;
                        if (TryCoerceType(value, fld, out obj, tmpReasons))
                        {
                            builder[fld] = obj;
                        }
                    }
                    else if (name == "line_break")
                    {
                        string tmp;
                        if (LineBreaks.TryGetValue(value, out tmp))
                        {
                            LineBreak = tmp;
                        }
                        else
                        {
                            tmpReasons.Add("Invalid value for 'line_break': " + value + ".");
                        }
                    }
                    else if (!File.Exists(argument))
                    {
                        doHelp = true;
                        tmpReasons.Add("Unknown argument '" + name + "'.");
                    }
                    else
                    {
                        InputFiles.Add(argument);
                    }
                }
                else
                {
                    InputFiles.Add(argument);
                }
            }

            if (doHelp || InputFiles.Count == 0)
            {
                tmpReasons.Add("Arguments:");
                foreach (KeyValuePair <string, FieldDescriptor> field in fields)
                {
                    tmpReasons.Add(String.Format("-{0}=[{1}]", field.Key, field.Value.FieldType));
                }
                tmpReasons.Add("-line_break=[" + string.Join("|", new List <string>(LineBreaks.Keys).ToArray()) + "]");
                tmpReasons.Add("followed by one or more file paths.");
            }
            else
            {
                FileOptions = builder.Build();
            }
        }