Parsing 如何使用PetitParser匹配省道字符串中的表达式?

Parsing 如何使用PetitParser匹配省道字符串中的表达式?,parsing,dart,petitparser,Parsing,Dart,Petitparser,我想使用PetitParserDart解析dart字符串中的嵌入表达式 准备一些物品: 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]; 长字符串: var s = """ Hello,

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

准备一些物品:

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];
长字符串:

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.
"""
您可以看到字符串中有一个
${}
,其内容非常复杂

我正在尝试使用这样的小密码:

def("expr_in_string", string('${').ref('expr').char('}'));
def("expr", ????);
但是我不知道如何定义
expr
规则。它可能包含
{
}
,因此我不能简单地使用
anyIn('{}').neg()


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

src/Dart/grammar.Dart中有一个Dart语法,它似乎能够解析它。

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

代码:

测试代码:

  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);
它打印:

[$, [{, [
,  ,  ,  ,  ,  ,  , 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, [(, [], )], 
,  ,  ,  ,  ,  ,  ], }]]
我认为这是正确的,但我仍然在寻找一个更简单的解决方案


更新:

它无法处理如此复杂的代码:

"""${
  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()
  }"""

这是
${}
中的字符串,它位于
${}
中。除此之外还有其他情况吗?

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

我看到了那个演示,但它确实太复杂了,无法理解。根据您想要完成的内容,您可能希望将analyzer_实验作为替代。谢谢您,Lukas。你能给我一个我的解决方案不能正确处理的例子吗?我认为包含注释的表达式处理得不正确。
"""${
  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()
  }"""