https://github.com/dhakehurst/net.akehurst.language/blob/efafa3e57f89ddea2f81ca3080121f2e70cce9e0/net.akehurst.language/agl-processor/src/commonMain/kotlin/processor/LanguageProcessorDefault.kt#L94
草,觉得可以学习一下,自带补齐方法
草,觉得可以学习一下,自带补齐方法
override fun expectedAt(goalRuleName: String, inputText: CharSequence, position: Int, desiredDepth: Int): List<CompletionItem>
override fun expectedAt(inputText: CharSequence, position: Int, desiredDepth: Int): List<CompletionItem>GitHub
dhakehurst/net.akehurst.language
Generic Language (DSL) support for kotlin multiplatform (parser, syntax-analyser, formatter, processor, etc) - dhakehurst/net.akehurst.language
https://github.com/dhakehurst/net.akehurst.language/blob/efafa3e57f89ddea2f81ca3080121f2e70cce9e0/net.akehurst.language/agl-processor/src/commonMain/kotlin/parser/scannerless/ScannerlessParser.kt#L130
看到这里我被宏大的一个
看到这里我被宏大的一个
fun 给震惊到了,忽然想到为什么 ParserKt 不能 lazy 处理 SourceLocation 的问题,才记起 ParserKt 的输入是纯 Feed<T> 流,不可能回溯……GitHub
dhakehurst/net.akehurst.language
Generic Language (DSL) support for kotlin multiplatform (parser, syntax-analyser, formatter, processor, etc) - dhakehurst/net.akehurst.language
https://github.com/dhakehurst/net.akehurst.language/blob/efafa3e57f89ddea2f81ca3080121f2e70cce9e0/net.akehurst.language/agl-processor/src/commonMain/kotlin/parser/scannerless/InputFromCharSequence.kt
看到这个“新”Parser lib 我就知道 ParserKt 的设计是有多不容易了……
遇到 parser 既没有 lexer/parser 又没有 TERMINAL/NON-TERMINAL 还不强调scannerless因为它本身概念上就不存在scanner这…… 虽然和 Haskell 系的 Parserc 差不多,但更 Kotlin 一些
如今又得重构了……
看到这个“新”Parser lib 我就知道 ParserKt 的设计是有多不容易了……
遇到 parser 既没有 lexer/parser 又没有 TERMINAL/NON-TERMINAL 还不强调scannerless因为它本身概念上就不存在scanner这…… 虽然和 Haskell 系的 Parserc 差不多,但更 Kotlin 一些
如今又得重构了……
GitHub
dhakehurst/net.akehurst.language
Generic Language (DSL) support for kotlin multiplatform (parser, syntax-analyser, formatter, processor, etc) - dhakehurst/net.akehurst.language
https://github.com/dhakehurst/net.akehurst.kotlin.kt2ts #Kotlin #TypeScript #dev #tools 🤔 第一次知道可以这么干
看来 ParserKt 的 Kotlin/JS document 要靠这个人的实践经验了
看来 ParserKt 的 Kotlin/JS document 要靠这个人的实践经验了
GitHub
GitHub - dhakehurst/net.akehurst.kotlin.kt2ts: Typescript definition file generator for kotlin (js) classes
Typescript definition file generator for kotlin (js) classes - dhakehurst/net.akehurst.kotlin.kt2ts
https://github.com/dhakehurst/net.akehurst.language/blob/efafa3e57f89ddea2f81ca3080121f2e70cce9e0/net.akehurst.language/agl-processor/src/commonMain/kotlin/parser/sppt/SharedPackedParseTreeDefault.kt
这一系列操作…… 很算法啊
一般类似 ANTLR 一样的工具也会有 rewrite/action 的选择吧,可这个几乎只有 SPPT(shared packed parse tree) 一样……
ParserKt 是纯递归下降解析组合子,所以没有 YaCC 系的 Parser-Tree 说法,只有内部递归的调用树和临时的 Fold 对象,没有这种……
这一系列操作…… 很算法啊
一般类似 ANTLR 一样的工具也会有 rewrite/action 的选择吧,可这个几乎只有 SPPT(shared packed parse tree) 一样……
ParserKt 是纯递归下降解析组合子,所以没有 YaCC 系的 Parser-Tree 说法,只有内部递归的调用树和临时的 Fold 对象,没有这种……
GitHub
dhakehurst/net.akehurst.language
Generic Language (DSL) support for kotlin multiplatform (parser, syntax-analyser, formatter, processor, etc) - dhakehurst/net.akehurst.language
#Math 如何看待《华裔教授发现二次方程「极简」解法:丢掉公式,全球教科书可能都要改了》? - 王ruo宇的回答 - 知乎
https://www.zhihu.com/question/359765958/answer/930330106
https://www.zhihu.com/question/359765958/answer/930330106
Zhihu
如何看待《华裔教授发现二次方程「极简」解法:丢掉公式,全球教科书可能都要改了》? - 知乎
对于全球几十亿人口来说,二次公式是必须记下来的一个复杂公式(可能也是唯一的一个),这也是我们必须学…
你以为文言编程只是闹着玩?三个月后,人家IDE、教程、包管理器都有了 - 机器之心的文章 - 知乎
https://zhuanlan.zhihu.com/p/112650761 #PLT #Python
https://zhuanlan.zhihu.com/p/112650761 #PLT #Python
知乎专栏
你以为文言编程只是闹着玩?三个月后,人家IDE、教程、包管理器都有了
用文言文写的官方编程教程《文言陰符》,类似 pip 那样的包管理工具「文淵閣」,还有文言编程开源 IDE「文言齋」,文言编程语言已经这么成熟了?机器之心报道,参与:思、Jamin。机器之心曾介绍过 CMU 计算机专业…
./gui_crop_select.py ~/视频/IMG_6302.MP4
./extract_subtitles.py -crop '593(85,287)[481,38]' --crop-debug -filter-code '~cvInGrayRange(it, 0xcc, 0xff)' -lang chi_sim --chunk-size 1000 --use-sharp ~/视频/IMG_6302.MP4 现场来提取一个字幕时轴^
./timeline_ops.py merge frames/timeline_IMG_6302.MP4.txt 0.25|./timeline_ops.py to-lrc 25 srt>test.srt
duangsuse::Echo
./gui_crop_select.py ~/视频/IMG_6302.MP4 ./extract_subtitles.py -crop '593(85,287)[481,38]' --crop-debug -filter-code '~cvInGrayRange(it, 0xcc, 0xff)' -lang chi_sim --chunk-size 1000 --use-sharp ~/视频/IMG_6302.MP4 现场来提取一个字幕时轴^ ./timeline_ops.py merge fra…
(\d{2}): (\d{2}): (\S+)-> (\d{2}): (\d{2}): (\S+)
$1:$2:$3 --> $4:$5:$6 然后到 Google 上翻译下,以这个正则替换修复破损的 SRT 格式。
ffmpeg -i IMG_6302.MP4 -vf subtitles=IMG_6302_en.srt IMG_6302_zhEn.mp4🤔 我们来说说之前的 Montage.py 策划。
蒙太奇图是一种艺术画,它用许多相对整齐的子构件来构筑一副图画。
之前我们的安排就是,利用 Python Pillow / Java AWT+ImageIO 的接口,有一个画布以后直接取 color average (实际图像一般有三个 channel,我们只需给这片区域
然后遮盖那一部分原图区域的项就用这个颜色。
不过还有个问题,就是怎么知道项都放哪,之前的项目是有一个 LayoutPlanner,它会 yield 给一大堆 Rect(矩形区域),然后作画也在那上面(准确的说是给 draw 的算法一个 "sub-image" (后来改 crop 了) )完成,结果最后改来改去失败了,效果很不好
但后来我发现呢…… LayoutPlanner 实际上是不能独立于绘制算法要绘制的区域而存在的,所以失败是当然的。
现在的抽象会是这样
然后布局就是经典的 for y for x 了, x >= width 就 y += avg_h 。
参数:
font, font-size
color-mode, crop, scale (float / tuple)
image items
后来看了另一个项目才想起来的:
space-hv (tuple)
tint-color (code on sub-image
draw-unless (code on sub-image
蒙太奇图是一种艺术画,它用许多相对整齐的子构件来构筑一副图画。
之前我们的安排就是,利用 Python Pillow / Java AWT+ImageIO 的接口,有一个画布以后直接取 color average (实际图像一般有三个 channel,我们只需给这片区域
int[3][] 取 avg 即可)然后遮盖那一部分原图区域的项就用这个颜色。
不过还有个问题,就是怎么知道项都放哪,之前的项目是有一个 LayoutPlanner,它会 yield 给一大堆 Rect(矩形区域),然后作画也在那上面(准确的说是给 draw 的算法一个 "sub-image" (后来改 crop 了) )完成,结果最后改来改去失败了,效果很不好
但后来我发现呢…… LayoutPlanner 实际上是不能独立于绘制算法要绘制的区域而存在的,所以失败是当然的。
现在的抽象会是这样
class Drawable:
def drawOn(img: Image) -> Rect: pass
class TintedDrawable:
def drawOn(img: Image, tint: Color) -> Rect: pass 然后布局就是经典的 for y for x 了, x >= width 就 y += avg_h 。
参数:
font, font-size
color-mode, crop, scale (float / tuple)
image items
后来看了另一个项目才想起来的:
space-hv (tuple)
tint-color (code on sub-image
lambda it: averageColor(it) )draw-unless (code on sub-image
lambda it: pixelsInRange((0xFF,0xFF,0xFF), 10) / it.count() > 0.5 )Telegram
duangsuse::Echo
#memo Doge