Преглед изворни кода

LibXML: Shift some rule acceptances to make errors nicer

Instead of saying "expected />", make the parser output the real cause
for the following ("unknown reference"):
    <foo>&unknown;</foo>
Ali Mohammad Pur пре 9 месеци
родитељ
комит
202bfabdc6
1 измењених фајлова са 4 додато и 1 уклоњено
  1. 4 1
      Userland/Libraries/LibXML/Parser/Parser.cpp

+ 4 - 1
Userland/Libraries/LibXML/Parser/Parser.cpp

@@ -617,6 +617,7 @@ ErrorOr<void, ParseError> Parser::parse_element()
         return {};
         return {};
     }
     }
 
 
+    auto accept = accept_rule();
     auto start_tag = TRY(parse_start_tag());
     auto start_tag = TRY(parse_start_tag());
     auto& node = *start_tag;
     auto& node = *start_tag;
     auto& tag = node.content.get<Node::Element>();
     auto& tag = node.content.get<Node::Element>();
@@ -649,7 +650,6 @@ ErrorOr<NonnullOwnPtr<Node>, ParseError> Parser::parse_empty_element_tag()
     // EmptyElemTag ::= '<' Name (S Attribute)* S? '/>'
     // EmptyElemTag ::= '<' Name (S Attribute)* S? '/>'
     auto tag_start = m_lexer.tell();
     auto tag_start = m_lexer.tell();
     TRY(expect("<"sv));
     TRY(expect("<"sv));
-    auto accept = accept_rule();
 
 
     auto name = TRY(parse_name());
     auto name = TRY(parse_name());
     HashMap<Name, ByteString> attributes;
     HashMap<Name, ByteString> attributes;
@@ -669,6 +669,8 @@ ErrorOr<NonnullOwnPtr<Node>, ParseError> Parser::parse_empty_element_tag()
     TRY(skip_whitespace());
     TRY(skip_whitespace());
     TRY(expect("/>"sv));
     TRY(expect("/>"sv));
 
 
+    auto accept = accept_rule();
+
     rollback.disarm();
     rollback.disarm();
     return make<Node>(m_lexer.position_for(tag_start), Node::Element { move(name), move(attributes), {} });
     return make<Node>(m_lexer.position_for(tag_start), Node::Element { move(name), move(attributes), {} });
 }
 }
@@ -848,6 +850,7 @@ ErrorOr<void, ParseError> Parser::parse_content()
 {
 {
     auto rollback = rollback_point();
     auto rollback = rollback_point();
     auto rule = enter_rule();
     auto rule = enter_rule();
+    auto accept = accept_rule();
 
 
     // content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)*
     // content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)*
     auto content_start = m_lexer.tell();
     auto content_start = m_lexer.tell();