[英]Back referencing with peg.js
給定輸入[tag] Content [inner-tag] Inner [/inner-tag][/tag]
,我如何驗證是否有一個與[tag]
匹配的結束[/tag]
[tag]
?
現在,我的規則檢查下一個立即標記是否與最后一個開始標記匹配:
tagblock =
opentag:opentag content:content? closetag:closetag
{ if(opentag.name != closetag.name) {
throw new this.SyntaxError("No closing tag found for " + opentag.name);
} else {
return { name:opentag.name, content:content }
}
}
這適用於[tag] Content [/tag]
但不適用於上面的嵌套輸入。
您如何使用peg.js處理內部遞歸?
這是我想到的。
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
};
}
sTag =
"[" name:TagName "]" { return name; }
eTag =
"[/" name:TagName "]" { return name; }
TagName = chars:[a-z-]+ { return chars.join(""); }
Text = chars:[^[]+ { return chars.join(""); }
將其加載到nodejs之后:
var PEG=require('./markup.js');
var str = '[tag] Content [inner-tag] Inner [/inner-tag][/tag]';
PEG.parse(str);
結果是:
[ { name: 'tag',
content: [
' Content ',
{ name: 'inner-tag',
content: [ ' Inner ' ] }
]
} ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.