【问题标题】:Parsing Paragraphs in Peg.JS在 Peg.JS 中解析段落
【发布时间】:2017-06-23 21:50:36
【问题描述】:

我正在尝试学习 peg.js 并希望解析简单的文本“块”,但我正在努力解决如何对连续行进行分组而不会从我的语法中得到“可能的无限循环”错误。

目标:

line 1

line 3
line 4

line 6

解析后会变成:

{
   "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 东西,我只是想念它,因为我以前没有使用过 PEG。

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

【问题讨论】:

    标签: javascript pegjs


    【解决方案1】:

    你知道那些周你会在一天左右的时间里为某事挣扎,然后最终放弃,放下你的骄傲并发布一个问题到堆栈溢出......然后十分钟后找出答案?是的!那是我的一周。我认为写出问题的过程会让您以不同的方式思考问题,并且您的突触再次开始触发或其他什么...

    不管怎样,解决办法是:http://peg.arcanis.fr/4f4NdP/2/

    后人语法:

    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 / !.
    

    输入:

    line 1
    
    line 3
    line 4
    
    line 6
    

    输出:

    {
       "type": "root",
       "children": [
          {
             "type": "para",
             "content": "line 1"
          },
          {
             "type": "para",
             "content": "line 3
    line 4"
          },
          {
             "type": "para",
             "content": "line 6"
          }
       ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      相关资源
      最近更新 更多