Forwarded from Deleted Account
[a-z]+ 和 [a-z]*\d+
就是
[a-z]+ (\d+)
\d+
两个嘛,你想办法从上面的集合得到下面的集合大概就好了
说白了就是分支平铺吧 🤔
a* b = b or a+ b
就是
[a-z]+ (\d+)
\d+
两个嘛,你想办法从上面的集合得到下面的集合大概就好了
说白了就是分支平铺吧 🤔
a* b = b or a+ b
Forwarded from dnaugsuz
注意这段程序里其实也是嵌入了对
ParserKt 现在对 "EOF" 的不区分的确造成了一些问题(主要是只允许利用异常来表达 EOF 与否…… 没有不会 mutate stream 的方法),下一个版本我会进行改进
HexDigits 和 FewerHexdigits 是没硬性(命名上的)区别的,如果不够会被直接当成解析失败,它们的本质都是
ParserKt 的另一个亮点在于采用了 Fold 架构——
\uXXXX 和 non-terminated " 的处理情况的,但我们没有任何重复代码(而且也根本不需要…… ParserKt 里是没 EOF 的,因为一般情况不需要区分 EOF 和 "剩下的字符里没有符合条件的了" 这两种情况)ParserKt 现在对 "EOF" 的不区分的确造成了一些问题(主要是只允许利用异常来表达 EOF 与否…… 没有不会 mutate stream 的方法),下一个版本我会进行改进
HexDigits 和 FewerHexdigits 是没硬性(命名上的)区别的,如果不够会被直接当成解析失败,它们的本质都是
Repeat。ParserKt 的另一个亮点在于采用了 Fold 架构——
asInt(16) 是纯流式读取,没有任何调用 parseInt 之内函数的需要,尽可能减少不必要的内存占用(毕竟 atoi 也就是 acc = acc*10 + v 而已……Forwarded from dnaugsuz
木有啊…… 太难了,我现在的技术还是利用程序设计语言自己的调用栈和控制流状态机
如果 incremetal…… 找不到对应的替补,我之能想到一些,比如手动 slice input 再传给我们子解析器的 incremental
如果 incremetal…… 找不到对应的替补,我之能想到一些,比如手动 slice input 再传给我们子解析器的 incremental
Forwarded from dnaugsuz
🤔 https://github.com/Mivik/KiotLexer/blob/master/src/main/kotlin/com/mivik/kiot/lexer/Document.kt#L5
这里支持 index, length, seek (就是 move) 和 next, hasNext
怎么感觉有点像给 random access 扩展了个
这里支持 index, length, seek (就是 move) 和 next, hasNext
怎么感觉有点像给 random access 扩展了个
Iterator<Char>GitHub
Mivik/KiotLexer
A state-based lexer written in kotlin. Contribute to Mivik/KiotLexer development by creating an account on GitHub.
Forwarded from dnaugsuz
Feed 架构有点太死了感觉(这个版本就只有 peek-1 的 peek, consume() )
下个版本我会把 ErrorHandler 重命名为更贴切的 FeedError 并且加入 FeedTerminate
我是最近一年才开始用这种「伪动态类型」的架构风格的…… 基本上就是先制定一个功能很少的基类,再利用接口和 instanceof 扩展功能
下个版本我会把 ErrorHandler 重命名为更贴切的 FeedError 并且加入 FeedTerminate
我是最近一年才开始用这种「伪动态类型」的架构风格的…… 基本上就是先制定一个功能很少的基类,再利用接口和 instanceof 扩展功能
Forwarded from Mivik Q
abc abc ab这种,如果来一个"abc ".repeat(2..3)的消耗,那么是需要到ab那里才能决定并回退
Forwarded from dnaugsuz
🤔 其实你也可以学一下
虽然我之前也实现过一个(基于 List 的泛型流回溯),不过 ParserKt 现在是没有回溯功能的(而且我也不打算加入,因为我觉得 peek-1 好像也怪强大的)
其实主要还是害怕支持 backtracking 后,会使得框架实现对新手更为难懂,而 ParserKt 很重视别人理解上的开销……
java.io.Reader ,它们那有个 mark/reset 操作,可以不必暴露完 pos (tell) / seek 虽然我之前也实现过一个(基于 List 的泛型流回溯),不过 ParserKt 现在是没有回溯功能的(而且我也不打算加入,因为我觉得 peek-1 好像也怪强大的)
其实主要还是害怕支持 backtracking 后,会使得框架实现对新手更为难懂,而 ParserKt 很重视别人理解上的开销……
Forwarded from dnaugsuz
https://github.com/duangsuse-valid-projects/Share/blob/master/Others/kt_misc/pkt_7/Parser.kt#L128 #parsing #Kotlin
就是在这里,我定义了
所以说 ParserKt 最开始是有 mark/reset 这种常见操作的
我现在也破除了对所谓 one-pass 的迷信,但因为实现起来相对复杂还是不打算恢复 >1 的预判
当然说白了不允许“预取”说到底是架构上对子解析器程序灵活性的限制,不是说不能预取就根本没法实现(但实践上它还是会对实现复杂文法增加很大难度,举个例子 (/**) ... */ 这种要判两个字符翻译过来是
只不过这是 ParserKt 的选择,如果允许就有点狗拿耗子了,还是要做好自己分内的、能够并且擅长实现的工作才好。
正则擅长做的事情就让它去做,它并不落后;ANTLR 擅长的复杂文法和跨语言就让它生成解析器;ParserKt 的目标虽然不止限于 prototype 或 quick hack,但也就是个小工具,不能包容万物…… 类似 editor highlight 这种经常更新的事对 ParserKt代码就不容易复用,但整体看形式化文法的数据结构是跨任何语言和利用方式的,我很重视它们自己与生俱来的复用性。
就是在这里,我定义了
abstract class StackMarkReset<T>: MarkReset后者被用于实现了
abstract class BufferMarkReset<BUF>: MarkReset
open class Input<T>(private val feed: Feed<T>) 所以说 ParserKt 最开始是有 mark/reset 这种常见操作的
我现在也破除了对所谓 one-pass 的迷信,但因为实现起来相对复杂还是不打算恢复 >1 的预判
当然说白了不允许“预取”说到底是架构上对子解析器程序灵活性的限制,不是说不能预取就根本没法实现(但实践上它还是会对实现复杂文法增加很大难度,举个例子 (/**) ... */ 这种要判两个字符翻译过来是
Repeat(Repeat(. until '*' postfix not ('/')) ) postfix '/' 看起来十分诡异,而且非常不适合解析结果的构造 )只不过这是 ParserKt 的选择,如果允许就有点狗拿耗子了,还是要做好自己分内的、能够并且擅长实现的工作才好。
正则擅长做的事情就让它去做,它并不落后;ANTLR 擅长的复杂文法和跨语言就让它生成解析器;ParserKt 的目标虽然不止限于 prototype 或 quick hack,但也就是个小工具,不能包容万物…… 类似 editor highlight 这种经常更新的事对 ParserKt代码就不容易复用,但整体看形式化文法的数据结构是跨任何语言和利用方式的,我很重视它们自己与生俱来的复用性。
GitHub
duangsuse-valid-projects/Share
🐕 duangsuse's shared files(e.g. productive software projects, documents) - duangsuse-valid-projects/Share
🤔感觉其实关系式最重要的就是一个
6大基本元素,State, Variable 其实是一家的,State 就是一个 MutableMap,Varaible 则是上面的一个 key,它可能被当成一个 value container 使用也可能被当成 value 使用,反正同时可以是输入和输出,以方便各种计算方式(1+2 = ?; 1+? = 3)
fresh (introduce) 就是作用域策略;然后剩下 Eq,Both, Either 三个 goal 来定义关系、执行计算
关键还是中间的等号,利用相等关系解构出值,而且还有对称性…… 我喜欢把 <= 叫 "from"、 => 叫 "to" (现在改 back 了,因为我嫌它长度不对称),反正左边是目的右边是源。
关键问题是,怎么让 unification 更“纯粹”点,现在我看到的方法正着 a b 写一遍、反着 b a 也得写一遍,可是有些关系是不需要这么复杂的…… 是不是真的这样呢?
a + b = c 嘛6大基本元素,State, Variable 其实是一家的,State 就是一个 MutableMap,Varaible 则是上面的一个 key,它可能被当成一个 value container 使用也可能被当成 value 使用,反正同时可以是输入和输出,以方便各种计算方式(1+2 = ?; 1+? = 3)
fresh (introduce) 就是作用域策略;然后剩下 Eq,Both, Either 三个 goal 来定义关系、执行计算
关键还是中间的等号,利用相等关系解构出值,而且还有对称性…… 我喜欢把 <= 叫 "from"、 => 叫 "to" (现在改 back 了,因为我嫌它长度不对称),反正左边是目的右边是源。
关键问题是,怎么让 unification 更“纯粹”点,现在我看到的方法正着 a b 写一遍、反着 b a 也得写一遍,可是有些关系是不需要这么复杂的…… 是不是真的这样呢?
Forwarded from Hacker News
Why I’m Leaving Elm (Score: 108+ in 3 hours)
Link: https://readhacker.news/s/4jXfR
Comments: https://readhacker.news/c/4jXfR
Link: https://readhacker.news/s/4jXfR
Comments: https://readhacker.news/c/4jXfR
https://zhuanlan.zhihu.com/codeInChinese 绝句早就应该开始实现的,你看,他们又做出一个支持 layout 的语言『卓语言』
https://zhuanlan.zhihu.com/p/127020521
有点像 Python 和 Lua 杂交的感觉,而且我不得不承认它还蛮中文,所以说拖得越久对绝句越不利。
虽然导入里的命名非常魔法,文件名不能带“的”(当然绝句的模块化不是 Python 系的,所以没有这个问题,有也可以用强行合法化)
https://zhuanlan.zhihu.com/p/101690331
卓语言看起来应该也是近一年的事情,但无论怎样绝句拖得越久,它的越来越多“独有特性”便会被开始引入这个领域是个事实…… 到最后,最坏的下场是它没有任何“创新”的设计了。
https://zhuanlan.zhihu.com/p/127020521
有点像 Python 和 Lua 杂交的感觉,而且我不得不承认它还蛮中文,所以说拖得越久对绝句越不利。
导入包:卓语言系统,卓操作系统,卓文件系统,卓批处理
导入类:批处理命令,常用转义符,控制台
属于:唯一类型
启动:
输出"控制我的文档桌面显示,通过修改注册表相关数据实现"
输出"请输入要操作的选项代号:1 显示, 2 不显示"
控制台读取文本=>S
如果S=="1"
写入数据0
否则
写入数据1
输出"操作成功,请刷新桌面"
暂停
写入数据(整数X):
A=注册表"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel"
如果A不存在
A创建
A向键"{59031a47-3f72-44a7-89c5-5595fe6b30ee}"写入X 虽然导入里的命名非常魔法,文件名不能带“的”(当然绝句的模块化不是 Python 系的,所以没有这个问题,有也可以用强行合法化)
https://zhuanlan.zhihu.com/p/101690331
卓语言看起来应该也是近一年的事情,但无论怎样绝句拖得越久,它的越来越多“独有特性”便会被开始引入这个领域是个事实…… 到最后,最坏的下场是它没有任何“创新”的设计了。
知乎专栏
中文编程
因地制宜,尽量用中文写代码