我需要在谓词的帮助下创建语法。对于给定的大小写,下面的语法失败。
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]+;对于给定的输入,它将失败,因为
com.mytest.create();它应该在结果部分中将"create“作为"name”键的值。
任何帮助都会很好。
发布于 2014-11-06 02:44:35
这里有几件事。
最重要的是,你必须意识到聚乙二醇是贪婪的。这意味着您的(DOT id)*规则匹配所有DOT id序列,包括您在startRule中作为DOT b:id拥有的序列。
这可以通过放眼来解决。
另一件事是,您必须记住使用join,因为默认情况下,它将作为数组的成员返回每个字符。
我还为分号添加了一个规则。
试试这个:
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(''); }据我所知,我正确地解析了这一行。
https://stackoverflow.com/questions/26652882
复制相似问题