首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Peg.JS中的段落解析

Peg.JS中的段落解析
EN

Stack Overflow用户
提问于 2017-06-23 13:36:41
回答 1查看 1K关注 0票数 0

我正在努力学习peg.js,并希望解析简单的文本“块”,但我很难从语法中得到“可能的无限循环”错误,但是我很难对顺序行进行分组。

目标:

代码语言:javascript
复制
line 1

line 3
line 4

line 6

当被解析时会变成:

代码语言:javascript
复制
{
   "type": "root",
   "children": [
      { type: "para", content: "line 1" },
      { type: "para", content: "line 3\nline 4" },
      { type: "para", content: "line 6" },
   ]
}

换言之:

  • 第一行是它自己的一个段落,因为它后面有一个空行。
  • 第三行和第四行是一个段落,因为它们后面有一个空行。
  • 第六行是一个段落,因为它是最后一行(多一条矿石)

我可以编写与行和空行相匹配的语法(请参阅http://peg.arcanis.fr/4f4NdP/),但是,为了使多个连续行后面的空行(或EOF)变成段落,我所做的任何事情都会导致递归错误。我觉得这是一个非常简单的n00b的东西,我只是错过了,因为我从来没有使用过聚乙二醇。

我知道我可以在初始化程序块中编写一个全局函数,并跟踪最后一个元素并使其上下文化,但我觉得这并不是真正使用语法的方式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-23 13:50:36

你知道在那些星期里,你挣扎了一天左右,然后终于放弃了,吞下你的骄傲,贴出一个问题,堆积如山.十分钟后就知道答案了?是啊!那是我的一周。我认为写问题的过程会让你以不同的方式思考这个问题,你的突触又开始发火了。

不管怎样,这里有一个解决方案:http://peg.arcanis.fr/4f4NdP/2/

后世语法:

代码语言:javascript
复制
start = head:Para tail:(newline Para)*
   {
      var t;

      t = tail.reduce(function(memo, element) {
         return memo.concat(element[1]);
      }, []);

      return {
         type: 'root',
         children: [ head ].concat(t),
      }
   }

Para = text:LineOfText+
   { return { type: 'para', content: text.join('\n') } }

LineOfText = text:$(char+) EOL
   { return text }

char = [^\n\r]
newline = '\n' / '\r' '\n'?
EOL = newline / !.

输入:

代码语言:javascript
复制
line 1

line 3
line 4

line 6

输出:

代码语言:javascript
复制
{
   "type": "root",
   "children": [
      {
         "type": "para",
         "content": "line 1"
      },
      {
         "type": "para",
         "content": "line 3
line 4"
      },
      {
         "type": "para",
         "content": "line 6"
      }
   ]
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44722825

复制
相关文章

相似问题

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