使用 petitparser 解析定界字符串
Parsing delimited strings using petitparser
我原本希望(手动)为我的语法写一个简单的 tokenise/parser,但我的一个要求意味着标记化有点繁琐。
我需要能够支持定界字符串的概念,其中定界符可以是任何字符。例如。字符串最有可能使用双引号分隔(例如 "hello"
),但也可以很容易地使用 /hello/
或 ,hello,
或病态的 xhellox
所以,我开始研究可能有哪些替代方案来进行组合 tokenise/parse...这是我偶然发现 petit 解析器的时候。
只是好奇这种类型的分隔字符串是否可以使用 Petit Parser 进行解析?谢谢
使用 PetitParser 可以通过多种方式实现这一点。可能最优雅的是使用延续解析器:
final delimited = any().callCC((continuation, context) {
final delimiter = continuation(context).value.toParser();
final parser = [
delimiter,
delimiter.neg().star().flatten(),
delimiter,
].toSequenceParser().pick<String>(1);
return parser.parseOn(context);
});
上面的代码片段解析起始字符 any()
(如有必要,可以进一步限制),然后从中动态创建一个 delimiter
解析器。此外,它将定界符解析器组合成一个解析起始字符、内容(不是起始字符)和结束字符的解析器,并使用新的解析器来使用输入。这也给出了真正的 nice error messages.
我原本希望(手动)为我的语法写一个简单的 tokenise/parser,但我的一个要求意味着标记化有点繁琐。
我需要能够支持定界字符串的概念,其中定界符可以是任何字符。例如。字符串最有可能使用双引号分隔(例如 "hello"
),但也可以很容易地使用 /hello/
或 ,hello,
或病态的 xhellox
所以,我开始研究可能有哪些替代方案来进行组合 tokenise/parse...这是我偶然发现 petit 解析器的时候。
只是好奇这种类型的分隔字符串是否可以使用 Petit Parser 进行解析?谢谢
使用 PetitParser 可以通过多种方式实现这一点。可能最优雅的是使用延续解析器:
final delimited = any().callCC((continuation, context) {
final delimiter = continuation(context).value.toParser();
final parser = [
delimiter,
delimiter.neg().star().flatten(),
delimiter,
].toSequenceParser().pick<String>(1);
return parser.parseOn(context);
});
上面的代码片段解析起始字符 any()
(如有必要,可以进一步限制),然后从中动态创建一个 delimiter
解析器。此外,它将定界符解析器组合成一个解析起始字符、内容(不是起始字符)和结束字符的解析器,并使用新的解析器来使用输入。这也给出了真正的 nice error messages.