gpt4 book ai didi

javascript - 使用 peg.js 解析 XML 单节点

转载 作者:行者123 更新时间:2023-11-28 00:57:08 24 4
gpt4 key购买 nike

给定输入<outer> Content <inner> Inner <single/> </inner> </outer> .

我将如何编写解析 <single> 的语法节点以及具有匹配的结束节点的节点?

这是我当前的语法,取自 here :

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(""); }

但这还没有取得任何成功。

有什么想法吗?

最佳答案

我的做法是让 Element 匹配“sTag”或“selfTag”;如果它与“selfTag”匹配,则没有“Content”或“endTag”:

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(""); }

请注意,此答案要求您使用 <single/>而不是<single> (即/是必需的);这是向 PEG 解析器发出悬空开始标记和“自结束标记”之间差异的最简单方法。

关于javascript - 使用 peg.js 解析 XML 单节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26089940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com