/tmp/duangsuse.sock
23 subscribers
303 photos
3 videos
92 files
337 links
从 duangsuse::Echo (@dsuse) 跟进出来的分支,将在作者恢复原帐号访问的时候合并删除。
Download Telegram
class BoolScanner(feed: Feed<Char>): LexerFeed<Int>(feed) {
override fun tokenizer() = KeywordPattern<Int>().apply { mergeStrings("true" to 1, "false" to 0) }
override val eof = -1
}
这么说来,其实在这无聊的时候试着让 ParserKt 能在简洁性上吊打其他的框架,才是最有意思的事情吧……
This media is not supported in your browser
VIEW IN TELEGRAM
真的已经分不清框架的核心和外设了…… 都写在一个文件里 没有规矩
说实在话,其实 ParserKt 现在的 Pattern 架构处理 leftrec 文法也没问题,我早想过了,只需要弄个 LrDecide 和 leftrec {},靠异常系统就可以工作
http://canopy.jcoglan.com/
grammar Maps
map <- "{" string ":" value "}" %make_map
string <- "'" [^']* "'" %make_string
value <- list / number
list <- "[" value ("," value)* "]" %make_list
number <- [0-9]+ %make_number

lateinit var list: Pattern<Char, List<Any>>
val comma = item(',').tokenize()
val number = Repeat(asInt(), digitFor('0'..'9'))
val string = SurroundBy(quotes.clamly(), stringFor(!item('\'')))
val value = Decide(number, Deferred{list}).mergeFirst { if (it is List<*>) 1 else 0 }.also {
list = SurroundBy(squares.clamly(), JoinBy(comma, it) )
}
val kvPart = Seq(::AnyTuple, string, item(':'), value)
val kv = Convert(kvPart, { it[0] to it[1] }, { anyTupleOf(first, ':', second) })
val map = SurroundBy(braces.clamly(), JoinBy(comma, kv))

直接从输入到 Any 值、直接从 Any 值弄回输入,类型全贴上。
Forwarded from 憨憨的碎碎念 | #春节限定跑路 (wuhang2003)
一本英语书的神预测
/tmp/duangsuse.sock
真的已经分不清框架的核心和外设了…… 都写在一个文件里 没有规矩
现在 ParserKt 也的确是越来越乱了…… 一些基本模型的实现,也被我质疑是 不够简洁 也能被查出 bug 了么……

看来 严格的工程规范 是必须了
可是我没有硬件条件,用不起 Gradle,而且自动化测试困难
21 行。从规则到 kotlin.Any,再 rebuild 回来。
[duangsuse@susepc pkt_9]$ kotlin MapSyntax
{'das':[1,2, 3,4], 'kas':444}
{das=[1, 2, 3, 4], kas=444}
{'das': [1, 2, 3, 4], 'kas': 444}
{'hello': [1,2,3, 4, 5,6], 'wor' 
{
Exception in thread "main" ParseError: <stdin>:2:0: expecting item for last seprator

{'fff':[1,2,3}
Exception in thread "main" ParseError: <stdin>:1:13: expecting `']'' (from <stdin>:1:8)

{'emm': 2333
Exception in thread "main" ParseError: <stdin>:2:0: expecting `'}'' (from <stdin>:1:1)

而且带完整的错误提示,而且还支持容错解析(就是上文的 clamly)
Forwarded from Justf News (Justf | 盲人)
Forwarded from POLICR · 更新通知
#安全警告 最近出现了一些极其严重的炸群现象,短时间内成百上千的 spammer 涌入到一个群中。

建议暂时关闭普通群成员的拉人(Add Users)功能。特别是一些经常受骚扰的群。注意,如果是公开群,不要轻易转为私有群,username 可能会被抢注。
吊打其他解析器框架实在是太爽了
什么左递归,算法大佬,可是写出来的定义能如 ParserKt 一样好看高性能吗?
补充一下,有人把石狮子的…… 给 宫刑 了
[duangsuse@susepc pkt_9]$ kotlin Arithmetic
1 + (2 - 3) + 4
+ + 1 (- 2 3) 4
= 4
[duangsuse@susepc pkt_9]$ kotlin Arithmetic
1+(2 - 3 + 4
null
= null
[(<stdin>:2:0#13, expecting ')' (from <stdin>:1:3)), (<stdin>:2:0#13, infix 1 parse failed at +)]
又拿 ParserKt 写了个计算器出来
/tmp/duangsuse.sock
现在 ParserKt 也的确是越来越乱了…… 一些基本模型的实现,也被我质疑是 不够简洁 也能被查出 bug 了么…… 看来 严格的工程规范 是必须了 可是我没有硬件条件,用不起 Gradle,而且自动化测试困难
但是我可以很自信地说,ParserKt 再乱也比那一堆 JavaScript 的 parser compiler (CFG, PEG) / parser combinator 好看

别的组合子框架里六行,在 ParserKt 里是一行真正即得易见平凡。
无论是 scannerless parsing 还是 lexer-parser 风格,都能完美兼容,除了异常系统不需要别的特性支撑。
PEG.js is a simple parser generator for JavaScript that produces fast parsers with excellent error reporting. 可惜就是参数名黏糊了一点,不能体现重点。
Ohm is a parser generator consisting of a library and a domain-specific language 可惜就是若要加“语义”,那代码就看不了喽。