feat: 图片扫描和发布命令 (#5)
All checks were successful
Build blog docker image / Build-Blog-Image (push) Successful in 1m26s

Reviewed-on: #5
This commit is contained in:
2024-08-25 15:38:58 +08:00
parent 9111affeec
commit 4085b0d99c
18 changed files with 208 additions and 31 deletions

View File

@@ -44,7 +44,7 @@ bool ParserBoolValue(string input)
}
```
这就是一个**解析器Parser**的原型实现:输入需要识别的字符串,输出识别的结果。在这个原型方法中,我们可以很容易发现两个问题:
这就是一个 **解析器Parser** 的原型实现:输入需要识别的字符串,输出识别的结果。在这个原型方法中,我们可以很容易发现两个问题:
1. 解析器并不会**消耗**输入的字符串,缺少一个读取字符串的游标。
2. 解析器输出结果的方式并不高明,输出的结果只能是解析成功情况的结果,解析失败的情况需要通过抛出一个自定义的异常`InvalidInputException`,但是考虑到一个解析器解析失败是非常常见的情况,在这里使用异常方式返回错误结果会导致非常严重的性能问题。
@@ -64,7 +64,7 @@ public abstract class Parser<T>
上面解析器基类中,类上的泛型参数`T`表示该解析器最终解析结果的类型,解析函数`Parse`的泛型参数`TState`是实现了输入状态`IReadState`的类型,返回的类型`ParseResult`就是上文中提到的解析结果基类。
在设计完解析器之后,该谈一谈**组合子Combinator**了。实际上组合子就是将多个解析器组合到一起的一系列函数,输入一个或者多个解析器,输出一个合并之后的解析器。容易想到,各种解析器组合在一起的方式千千万万,但是实际上我们只需要实现一系列基本的组合子,就可以通过综合使用各种解析器和组合子将各种需要的解析器和组合子实现出现。实际上,这也是解析器组合子思想的集中体现,通过基础的“砖块”(解析器)和“水泥“(组合子)设计和实现各种构建,最终建造出宏伟的高楼。
在设计完解析器之后,该谈一谈 **组合子Combinator** 了。实际上组合子就是将多个解析器组合到一起的一系列函数,输入一个或者多个解析器,输出一个合并之后的解析器。容易想到,各种解析器组合在一起的方式千千万万,但是实际上我们只需要实现一系列基本的组合子,就可以通过综合使用各种解析器和组合子将各种需要的解析器和组合子实现出现。实际上,这也是解析器组合子思想的集中体现,通过基础的“砖块”(解析器)和“水泥“(组合子)设计和实现各种构建,最终建造出宏伟的高楼。
基础解析器和组合子的选择因人而异,但是一个常见的组合是: