首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用peg.js进行反向引用

用peg.js进行反向引用
EN

Stack Overflow用户
提问于 2014-09-28 09:03:55
回答 1查看 92关注 0票数 1

给定输入[tag] Content [inner-tag] Inner [/inner-tag][/tag],如何验证是否有与[tag]匹配的关闭[/tag]

现在,我的规则检查下一个立即标记是否与最后一个开始标记匹配:

代码语言:javascript
复制
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处理这样的内部递归?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-28 21:07:55

这是我想出来的那个。

代码语言:javascript
复制
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之后:

代码语言:javascript
复制
var PEG=require('./markup.js'); 
var str = '[tag] Content [inner-tag] Inner [/inner-tag][/tag]';
PEG.parse(str);

结果是:

代码语言:javascript
复制
[ { name: 'tag',
    content: [
        ' Content ',
        { name: 'inner-tag',
          content: [ ' Inner ' ] }
    ]
} ]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26083300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档