Javascript 使用peg.js进行XML单节点解析

Javascript 使用peg.js进行XML单节点解析,javascript,xml,peg,Javascript,Xml,Peg,给定输入内容内部 如何编写语法来解析节点以及具有匹配结束节点的节点 这是我目前的语法,摘自: 但这并没有带来任何成功 有什么想法吗?我的方法是让元素匹配“sTag”或“selfTag”;如果与“selfTag”匹配,则没有“Content”或“endTag”: 内容= (要素/文本)* 元素= 开始标记:sTag内容:内容结束标记:eTag{ if(startTag!=endTag){ 抛出新错误( “预期但发现。” ); } 返回{ 姓名:startTag,, 内容:内容 }; } /star

给定输入
内容内部

如何编写语法来解析
节点以及具有匹配结束节点的节点

这是我目前的语法,摘自:

但这并没有带来任何成功


有什么想法吗?

我的方法是让元素匹配“sTag”或“selfTag”;如果与“selfTag”匹配,则没有“Content”或“endTag”:

内容=
(要素/文本)*
元素=
开始标记:sTag内容:内容结束标记:eTag{
if(startTag!=endTag){
抛出新错误(
“预期但发现。”
);
}
返回{
姓名:startTag,,
内容:内容
};
}
/startTag:selfTag{
返回startTag;
}
雄鹿=
“{返回名称;}
自我标签=
“{返回名称;}
埃塔格=
“{返回名称;}
标记名=chars:[a-z-]+{返回chars.join(“”;}

Text=字符:[^Gah-ya更改了我身上的标记分隔符,你这个傻瓜!:)哎呀,很抱歉!一开始这是一个输入错误。但它似乎仍然不起作用?我收到一个错误:
预期但找到了。
它在没有
节点的情况下工作。啊,我现在看到了
部分。它现在可以工作了。你认为它不可能工作吗不关闭
/
?这将非常困难-您必须仔细考虑如何区分未关闭的开始标记(这应该会正确地引发错误)还有一个不需要关闭的标签。我将在不使用额外的
/
的情况下让它工作。如果没有骰子,我将返回并将我的问题更改为使用
,并标记您的答案。谢谢。因此问题和答案可能会对您有所帮助,因为您将要处理的是一个“模糊语法”
Content =
  (Element / Text)*

Element =
  startTag:StartTag content:Content endTag:EndTag {
    if (startTag != endTag) {
      throw new Error(
        "Expected </" + startTag + "> but </" + endTag + "> found."
      );
    }

    return {
      name:    startTag,
      content: content
    };
  }

StartTag =
  "<" name:TagName ">" { return name; }

EndTag =
  "</" name:TagName ">" { return name; }

TagName = chars:[a-z]+ { return chars.join(""); }
Text    = chars:[^<]+  { return chars.join(""); }
Text    = chars:(!EndTag .)* EndTag { return chars.join(""); }
Content =
  (Element / Text)*

Element =
  startTag:sTag content:Content endTag:eTag {
    if (startTag != endTag) {
      throw new Error(
        "Expected </" + startTag + "> but </" + endTag + "> found."
      );
    }

    return {
      name:    startTag,
      content: content
    };
  }
  / startTag:selfTag {
        return startTag;
    }

sTag =
  "<" name:TagName ">" { return name; }

selfTag =
  "<" name:TagName "/>" { return name; }

eTag =
  "</" name:TagName ">" { return name; }

TagName = chars:[a-z-]+ { return chars.join(""); }
Text    = chars:[^<]+  { return chars.join(""); }