]> O.S.I.I.S - jp/crowedit.git/commitdiff
TokenType.UnexpectedChar to handle invalid '<' in xml elements
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sun, 6 Jul 2025 07:22:59 +0000 (09:22 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sun, 6 Jul 2025 07:22:59 +0000 (09:22 +0200)
CrowEditBase/src/Compiler/TokenType.cs
plugins/CECrowPlugin/src/Parsing/IML/ImlTokenType.cs
plugins/CEXmlPlugin/src/Parsing/XmlSyntaxAnalyser.cs
plugins/CEXmlPlugin/src/Parsing/XmlTokenType.cs
plugins/CEXmlPlugin/src/Parsing/XmlTokenizer.cs

index d34c355f52e45ed5c5ac72e2061bd811397d2200..1d25015b31d1864059d882232ecd6ef62c8419ee 100644 (file)
@@ -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
index 52849a5fee44ac07c9c1676c35a7ad7c586f161b..ee0eaea0865e4b51653e4edd989d5b75fdd5b9d2 100644 (file)
@@ -36,6 +36,7 @@ namespace CECrowPlugin
                AttributeValue                  = 0x2000,
                AttributeValueOpen              = 0x2001,
                AttributeValueClose             = 0x2002,
+               UnexpectedChar                  = 0x8000,
                Content,
                BindingOpen                     = 0xA401,// '{'
                BindingClose                    = 0xA402,// '}'
index 9832636dcf12f0aea67000a469ce20004ec46f60..587fbb94abe7c58a8e094f9a220811c748039b10 100644 (file)
@@ -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;
                                        }
index 4cbd24459ab87c49bf7ab7e83f15bf5f0e63a190..a96c7d4abe5d06126da12434c374b0009b4f6fae 100644 (file)
@@ -37,7 +37,7 @@ namespace CrowEdit.Xml
                AttributeValueOpen              = 0x2001,
                AttributeValueClose             = 0x2002,
 
-
+               UnexpectedChar                  = 0x8000,
                Content,
        }
 }
\ No newline at end of file
index 6fbf00dd832278e38a43cd5f1d48358e27b006e0..400d5a88464fa1933b347b4298023d33617d9c10 100644 (file)
@@ -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 '?':