diff --git a/src/parser.jl b/src/parser.jl index f1382b3..ee0ec49 100644 --- a/src/parser.jl +++ b/src/parser.jl @@ -87,9 +87,13 @@ field!(parser, dict) = begin while token == "," token = next_token!(parser, "a new entry or }") if token != "}" - key = token - expect!(parser, "=") - token, dict[lowercase(key)] = value!(parser) + key = lowercase(token) + if haskey(dict, key) + error("Duplicated field $key $(location(parser))") + else + expect!(parser, "=") + token, dict[key] = value!(parser) + end end end expect(parser, token, "}") @@ -139,6 +143,29 @@ julia> parse_bibtex("@book@") ERROR: Expected { on line 1 [...] ``` + +Repeated fields and keys are not allowed: + +```jldoctest +julia> using BibTeX: parse_bibtex + +julia> parse_bibtex(""\" + @book{abook, + title = A} + @book{abook, + title = B} + ""\") +ERROR: Duplicated id abook on line 3 +[...] + +julia> parse_bibtex(""\" + @book{abook, + title = A, + title = B} + ""\") +ERROR: Duplicated field title on line 3 +[...] +``` """ parse_bibtex(text) = begin parser = parse_text(text) @@ -155,10 +182,15 @@ parse_bibtex(text) = begin field!(parser, parser.substitutions) else id = next_token!(parser) - dict = Dict("__type__" => record_type) - expect!(parser, ",") - field!(parser, dict) - parser.records[id] = dict + records = parser.records + if haskey(records, id) + error("Duplicated id $id $(location(parser))") + else + dict = Dict("__type__" => record_type) + expect!(parser, ",") + field!(parser, dict) + records[id] = dict + end end end end