From c36ffce0bdf97bff176f92b65be52adade459e4d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Sun, 6 Jul 2025 09:22:59 +0200 Subject: [PATCH] TokenType.UnexpectedChar to handle invalid '<' in xml elements --- CrowEditBase/src/Compiler/TokenType.cs | 4 +- .../src/Parsing/IML/ImlTokenType.cs | 1 + .../src/Parsing/XmlSyntaxAnalyser.cs | 3 +- .../CEXmlPlugin/src/Parsing/XmlTokenType.cs | 2 +- .../CEXmlPlugin/src/Parsing/XmlTokenizer.cs | 45 +++++++++++-------- 5 files changed, 32 insertions(+), 23 deletions(-) diff --git a/CrowEditBase/src/Compiler/TokenType.cs b/CrowEditBase/src/Compiler/TokenType.cs index d34c355..1d25015 100644 --- a/CrowEditBase/src/Compiler/TokenType.cs +++ b/CrowEditBase/src/Compiler/TokenType.cs @@ -26,10 +26,10 @@ namespace CrowEditBase OpenBrace = 0x0405, CloseBrace = 0x0406, DoubleQuote = 0x0407, - SingleQuote = 0x0408, + SingleQuote = 0x0408, Operator = 0x0800, Keyword = 0x1000, - Syntax = 0x8000 + UnexpectedChar = 0x8000, } } \ No newline at end of file diff --git a/plugins/CECrowPlugin/src/Parsing/IML/ImlTokenType.cs b/plugins/CECrowPlugin/src/Parsing/IML/ImlTokenType.cs index 52849a5..ee0eaea 100644 --- a/plugins/CECrowPlugin/src/Parsing/IML/ImlTokenType.cs +++ b/plugins/CECrowPlugin/src/Parsing/IML/ImlTokenType.cs @@ -36,6 +36,7 @@ namespace CECrowPlugin AttributeValue = 0x2000, AttributeValueOpen = 0x2001, AttributeValueClose = 0x2002, + UnexpectedChar = 0x8000, Content, BindingOpen = 0xA401,// '{' BindingClose = 0xA402,// '}' diff --git a/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxAnalyser.cs b/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxAnalyser.cs index 9832636..587fbb9 100644 --- a/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxAnalyser.cs +++ b/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxAnalyser.cs @@ -131,8 +131,7 @@ namespace CrowEdit.Xml elt = processElement(new ElementSyntax(start)); break; } - //wouldd be better in tokenizer, and break on unexpected tok - if (Peek().Is(XmlTokenType.ElementOpen) || Peek().Is(XmlTokenType.EndElementOpen)) { + if (Peek().Is(XmlTokenType.UnexpectedChar)) { start.AddChild(new UnexpectedTokenSyntax(Read())); break; } diff --git a/plugins/CEXmlPlugin/src/Parsing/XmlTokenType.cs b/plugins/CEXmlPlugin/src/Parsing/XmlTokenType.cs index 4cbd244..a96c7d4 100644 --- a/plugins/CEXmlPlugin/src/Parsing/XmlTokenType.cs +++ b/plugins/CEXmlPlugin/src/Parsing/XmlTokenType.cs @@ -37,7 +37,7 @@ namespace CrowEdit.Xml AttributeValueOpen = 0x2001, AttributeValueClose = 0x2002, - + UnexpectedChar = 0x8000, Content, } } \ No newline at end of file diff --git a/plugins/CEXmlPlugin/src/Parsing/XmlTokenizer.cs b/plugins/CEXmlPlugin/src/Parsing/XmlTokenizer.cs index 6fbf00d..400d5a8 100644 --- a/plugins/CEXmlPlugin/src/Parsing/XmlTokenizer.cs +++ b/plugins/CEXmlPlugin/src/Parsing/XmlTokenizer.cs @@ -113,27 +113,36 @@ namespace CrowEdit.Xml curState = States.DTDObject; } } - } else if (reader.TryPeek('/')) { - reader.Advance (); - addTok (ref reader, XmlTokenType.EndElementOpen); - if (readName (ref reader)) { - addTok (ref reader, XmlTokenType.ElementName); - if (reader.TryPeek('>')) { - reader.Advance (); - addTok (ref reader, XmlTokenType.ClosingSign); - - if (--curObjectLevel > 0) - curState = States.Content; - else - curState = States.Xml; + } else { + bool levelup = false; + if (curState == States.StartTag) { + addTok (ref reader, XmlTokenType.UnexpectedChar); + levelup = true; + } + if (reader.TryPeek('/')) { + reader.Advance (); + addTok (ref reader, XmlTokenType.EndElementOpen); + if (readName (ref reader)) { + addTok (ref reader, XmlTokenType.ElementName); + if (reader.TryPeek('>')) { + reader.Advance (); + addTok (ref reader, XmlTokenType.ClosingSign); + levelup = true; + } + } + } else { + addTok (ref reader, XmlTokenType.ElementOpen); + if (readName (ref reader)) { + addTok (ref reader, XmlTokenType.ElementName); } + curState = States.StartTag; } - }else{ - addTok (ref reader, XmlTokenType.ElementOpen); - if (readName (ref reader)) { - addTok (ref reader, XmlTokenType.ElementName); + if (levelup) { + if (--curObjectLevel > 0) + curState = States.Content; + else + curState = States.Xml; } - curState = States.StartTag; } break; case '?': -- 2.47.3