https://tomassetti.me/parsing-in-javascript/#chevrotain
sealed class Token {
data class NamedConst(val name: String): Token()
}
fun KeywordPattern<Token>.mergeConsts(vararg names: String) = names.forEach { this[it] = Token.NamedConst(it) }
val namedConsts = KeywordPattern<Token>().apply {
mergeConsts("true", "false", "null")
}
val namedEscape = mapOf('b' to '\b', 't' to '\t', 'n' to '\n', 'r' to '\r', 'f' to '\u000C', 'v' to '\u000B')
val stringChar = Decide(!elementIn('"', '\n', '\\'), MapPattern(namedEscape) prefix item('\\')).mergeFirst {
if (it in namedEscape.values) 1 else 0 }
val string = SurroundBy(item('"') to item('"').clam {"unterminated string"}, stringFor(stringChar))Strumenta
Parsing in JavaScript: all the tools and libraries you can use
We present and compare all possible alternatives you can use to parse languages in JavaScript. From libraries to parser generators, we present all options
/tmp/duangsuse.sock
https://tomassetti.me/parsing-in-javascript/#chevrotain sealed class Token { data class NamedConst(val name: String): Token() } fun KeywordPattern<Token>.mergeConsts(vararg names: String) = names.forEach { this[it] = Token.NamedConst(it) } val namedConsts…
ParserKt 是 scannerless parsing 框架,目前对这样传统的 lexer-parser 结构 支持还不完善……
其实也可以用 iterator input,但着实是没好的 Pattern 去支持即时更新的 iterator
其实也可以用 iterator input,但着实是没好的 Pattern 去支持即时更新的 iterator
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 现在的 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 可能会被抢注。