首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PEGJS谓词文法

PEGJS谓词文法
EN

Stack Overflow用户
提问于 2014-10-30 12:22:42
回答 1查看 540关注 0票数 2

我需要在谓词的帮助下创建语法。对于给定的大小写,下面的语法失败。

代码语言:javascript
复制
startRule = a:namespace DOT b:id OPEN_BRACE CLOSE_BRACE {return {"namespace": a, "name": b}}

namespace = id (DOT id)*
DOT = '.';
OPEN_BRACE = '(';
CLOSE_BRACE = ')';
id = [a-zA-Z]+;

对于给定的输入,它将失败,因为

代码语言:javascript
复制
com.mytest.create();

它应该在结果部分中将"create“作为"name”键的值。

任何帮助都会很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-06 02:44:35

这里有几件事。

最重要的是,你必须意识到聚乙二醇是贪婪的。这意味着您的(DOT id)*规则匹配所有DOT id序列,包括您在startRule中作为DOT b:id拥有的序列。

这可以通过放眼来解决。

另一件事是,您必须记住使用join,因为默认情况下,它将作为数组的成员返回每个字符。

我还为分号添加了一个规则。

试试这个:

代码语言:javascript
复制
start =
  namespace:namespace DOT name:string OPEN_BRACE CLOSE_BRACE SM nl?
    {
      return { namespace : namespace, name : name };
    }

/* Here I'm using the lookahead: (member !OPEN_BRACE)*  */
namespace =
  first:string rest:(member !OPEN_BRACE)* 
    {
      rest = rest.map(function (x) { return x[0]; });
      rest.unshift(first);
      return rest;
    }

member =
  DOT str:string
    { return str; }

DOT =
  '.'

OPEN_BRACE =
  '('

CLOSE_BRACE =
  ')'

SM =
  ';'

nl =
  "\n"

string =
  str:[a-zA-Z]+
    { return str.join(''); }

据我所知,我正确地解析了这一行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26652882

复制
相关文章

相似问题

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