说实在话,其实 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>>直接从输入到 Any 值、直接从 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))
/tmp/duangsuse.sock
真的已经分不清框架的核心和外设了…… 都写在一个文件里 没有规矩
现在 ParserKt 也的确是越来越乱了…… 一些基本模型的实现,也被我质疑是 不够简洁 也能被查出 bug 了么……
看来 严格的工程规范 是必须了
可是我没有硬件条件,用不起 Gradle,而且自动化测试困难
看来 严格的工程规范 是必须了
可是我没有硬件条件,用不起 Gradle,而且自动化测试困难
{'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 POLICR · 更新通知
#安全警告 最近出现了一些极其严重的炸群现象,短时间内成百上千的 spammer 涌入到一个群中。
建议暂时关闭普通群成员的拉人(Add Users)功能。特别是一些经常受骚扰的群。注意,如果是公开群,不要轻易转为私有群,username 可能会被抢注。
建议暂时关闭普通群成员的拉人(Add Users)功能。特别是一些经常受骚扰的群。注意,如果是公开群,不要轻易转为私有群,username 可能会被抢注。
Forwarded from X
/tmp/duangsuse.sock
现在 ParserKt 也的确是越来越乱了…… 一些基本模型的实现,也被我质疑是 不够简洁 也能被查出 bug 了么…… 看来 严格的工程规范 是必须了 可是我没有硬件条件,用不起 Gradle,而且自动化测试困难
但是我可以很自信地说,ParserKt 再乱也比那一堆 JavaScript 的 parser compiler (CFG, PEG) / parser combinator 好看
别的组合子框架里六行,在 ParserKt 里是一行真正即得易见平凡。
无论是 scannerless parsing 还是 lexer-parser 风格,都能完美兼容,除了异常系统不需要别的特性支撑。
别的组合子框架里六行,在 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 可惜就是若要加“语义”,那代码就看不了喽。
Waxeye is a parser generator based on parsing expression grammars (PEGs). It supports C, Java, Javascript, Python, Ruby and Scheme. 我唯一看得上眼的工具,可惜在文档上还是略微欠缺了些。
Parsimmon is a small library for writing big parsers made up of lots of little parsers. The API is inspired by parsec and Promises/A+. 体现不出重点,有 lbrace 好啊,可是语法规则不是与语法本身对仗,而是与解析过程对仗,这就怎么写怎么也比不上
SurroundBy(item('{') to item('}'), wtf) 易读易复用。