如何用peg语法解析这个?

Joh*_*ith 7 parsing peg pegjs

我正在尝试使用pegjs制作解析器.我需要解析类似的东西:

blah blah START Lorem ipsum 
dolor sit amet, consectetur 
adipiscing elit END foo bar 
etc.
Run Code Online (Sandbox Code Playgroud)

我有麻烦写作规则来从捕捉文本"START""END".

ebo*_*man 10

使用否定前瞻谓词:

phrase
  =(!"START" .)* "START" result:(!"END" .)* "END" .* {
    for (var i=0;i<result.length;++i)
      // remove empty element added by predicate matching
      {result[i]=result[i][1];
      }
    return result.join("");
   }
Run Code Online (Sandbox Code Playgroud)

您需要对END和START使用否定谓词,因为pegjs中的重复是贪婪的.

或者,该动作可以写成

{return result.join("").split(',').join("");}
Run Code Online (Sandbox Code Playgroud)

虽然这依赖于join处理嵌套数组时不一定记录的行为(即它用逗号连接子数组然后连接它们).

[更新]处理空元素的更简单方法是

phrase
  =(!"START" .)* "START" result:(t:(!"END" .){return t[1];})* "END" .* {
      return result.join("");
    }
Run Code Online (Sandbox Code Playgroud)