簡體   English   中英

使用peg.js進行反向引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM