首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PetitParser匹配dart字符串中的表达式?

如何使用PetitParser匹配dart字符串中的表达式?
EN

Stack Overflow用户
提问于 2013-06-22 22:22:15
回答 3查看 373关注 0票数 2

我想使用PetitParserDart来解析dart字符串中的嵌入表达式。

准备一些对象:

代码语言:javascript
复制
class User {
    String name;
}
var user1 = new User()..name="Mike";
var user2 = new User()..name="Jeff";
var user3 = new User()..name="John}}}";
var users = [user1, user2, user3];

长字符串:

代码语言:javascript
复制
var s = """
Hello, this is an embed dart expression below:
  ${
     users.where((u)=>u.name!='Jeff}}}}}}}}')
          .where((u) { return u.name!='{{{John'})
          .map((u)=>u.name).toList()
   }
It's very complex.
"""

您可以看到字符串中有一个${},它的内容非常复杂。

我正在尝试使用这样的petitparser代码:

代码语言:javascript
复制
def("expr_in_string", string('${').ref('expr').char('}'));
def("expr", ????);

但是我不知道如何定义expr规则。它可能包含{},所以我不能简单地使用anyIn('{}').neg()

我现在该干啥?我觉得这将是一个非常复杂的规则。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-23 01:57:41

我认为,如果没有或多或少完整的Dart表达式语法,您就不能正确地解析所有可能的字符串。您可以编写一个近似值(就像您在答案中所做的那样),或者尝试使用示例附带的Dart语法的表达式结果。在这两种情况下,生成的语法都很复杂,因为您尝试匹配的东西也很复杂。

票数 1
EN

Stack Overflow用户

发布于 2013-06-23 00:04:35

在src/ Dart / that mar.dart中有一个dart的语法,它似乎能够解析它。

票数 0
EN

Stack Overflow用户

发布于 2013-06-23 00:28:44

我找到了一个解决方案:确定${}中的字符串,首先匹配它们。然后匹配所有{}

代码:

代码语言:javascript
复制
// whole `${...}`
def("expr", string(r"$") & ref("block_brace"));
// strings
def("dart_str_single", char("'") & (string(r"\'") | char("'").neg()).star() & char("'"));
def("dart_str_double", char('"') & (string(r'\"') | char('"').neg()).star() & char('"'));
def("dart_str_triple_single", string("'''") & string("'''").neg().star() & string("'''"));
def("dart_str_triple_double", string('"""') & string('"""').neg().star() & string('"""'));
// (...)
def("block_parenthesis", char('(') & (
    ref("dart_str_triple_single")
    | ref("dart_str_triple_double")
    | ref("dart_str_single")
    | ref("dart_str_double")
    | ref("block_parenthesis")
    | ref("block_brace")
    | char(')').neg()
).star() & char(')'));
// {...}
def("block_brace", char('{') & (
    ref("dart_str_triple_single")
    | ref("dart_str_triple_double")
    | ref("dart_str_single")
    | ref("dart_str_double")
    | ref("block_parenthesis")
    | ref("block_brace")
    | char('}').neg()
).star() & char('}'));

测试代码:

代码语言:javascript
复制
  var x4 = grammar["expr"];
  var yyy4 = x4.parse(r"""${
  users.where((u) => u.name != 'Jeff}}}}}}}}')
  .where((u) {
    return u.name != '{{{John';
  })
  .map((u) => u.name).toList()
  }""");
  print(yyy4.value);

它打印:

代码语言:javascript
复制
[$, [{, [
,  ,  ,  ,  ,  ,  , u, s, e, r, s, ., w, h, e, r, e, 
[(, [[(, [u], )],  , =, >,  , u, ., n, a, m, e,  , !, =,  , 
[', [J, e, f, f, }, }, }, }, }, }, }, }], ']], )], 
,  ,  ,  ,  ,  ,  , ., w, h, e, r, e, [(, [[(, [u], )],  , [{, 
[,  ,  ,  ,  ,  ,  ,  ,  , r, e, t, u, r, n,  , u, ., n, a, m, e,  , !, =,  , 
[', [{, {, {, J, o, h, n], '], ;, ,  ,  ,  ,  ,  ,  ], }]], )], 
,  ,  ,  ,  ,  ,  , ., m, a, p, [(, [[(, [u], )],  , =, >,  , u, ., n, a, m, e], )],
 ., t, o, L, i, s, t, [(, [], )], 
,  ,  ,  ,  ,  ,  ], }]]

我认为这是正确的,但我仍然在寻找一个更简单的解决方案。

更新:

它不能处理如此复杂的代码:

代码语言:javascript
复制
"""${
  users.where((u) => u.name != 'Jeff}}}}}}}}')
  .where((u) {
    return u.name != '{{{John${
  users.where((u) => u.name != 'Jeff}}}}}}}}')
  .where((u) {
    return u.name != '{{{John';
  })
  .map((u) => u.name).toList()
  }';
  })
  .map((u) => u.name).toList()
  }"""

那就是一个字符串中的${},它位于一个${}中。除了这个,还有没有别的情况?

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

https://stackoverflow.com/questions/17251750

复制
相关文章

相似问题

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