duangsuse::Echo
新的解析器框架,虽然还是很简单而且不支持容错什么的,但又支持了 PEG 文法…… 打算用 Java 重写个
parser.py
12 KB
再加上之前的 auxfun 模块,就完美了!虽然没有经过完整的属性测试
🤔 我觉得大家不能白吃我的代码,要不然被妮妮萌萌那样的人抄了,岂不没命? 上 GPL 吧
https://github.com/duangsuse-valid-projects/MontagePY/blob/master/helper/parser.py
可用的解析组合子模块,340 行,提供了 seq, br, repeat 等必要的 PEG 结构
和 FP.js 解析组合子的区别是,这个原则上不仅专门为非字符输入流兼容(这样你就可以手写
而且还支持 mark/reset
所谓的『灵活』,有时候也不过尔尔,还不如自动多态呢
可用的解析组合子模块,340 行,提供了 seq, br, repeat 等必要的 PEG 结构
和 FP.js 解析组合子的区别是,这个原则上不仅专门为非字符输入流兼容(这样你就可以手写
argparse 之类的)而且还支持 mark/reset
inp = ParserStream("def deepDarkFun(): return 'Oh, *****'") #内容过于不忍直视
with inp.positional():
print(inp.consume())
inp.skip(5)
print(inp.view())
所以它就可以处理这种结构from helper.parser import *写了一天也只有 889 行代码……
from helper.auxfun import concat, op_postfix
wdict = lambda s: s.strip().split(' ')
wdp = lambda wds: elem( list(concat(map(op_postfix('.capitalize()'), wds), wds) ))
wordict = '''
shoulder jam door
f**king s*it hard hot
we you us van billy
can f**k comming
oh ah ahh eh
ass deepDark
my next
'''
n, a, r, v, e, nr, r_uj = map(wdict, wordict.strip().split('\n'))
# Ass(nr) we(r) can(v)
# Oh(e) my(r_uj) f**king(a) shoulder(n)
deepDark = br(seq(wdp(nr), wdp(r), wdp(v)),
seq(wdp(e), wdp(r_uj), wdp(n)))
#darkParse = curry(Parser.run)(deepDark)
dark = lambda s: Parser.run(deepDark, s.split(' '))[1][1]
In [2]: dark('oh my shoulder')
Out[2]: ['oh', 'my', 'shoulder']
In [3]: dark('ass we can')
Out[3]: ['ass', 'we', 'can']
In [4]: deepDark
Out[4]: (([Ass:Deepdark:ass:deepDark] . [We:You:Us:Van:Billy:we:you:us:van:billy] . [Can:F**k:Comming:can:f**k:comming])|([Oh:Ah:Ahh:Eh:oh:ah:ahh:eh] . [My:Next:my:next] . [Shoulder:Jam:Door:shoulder:jam:door]))
—In [2]: dark('oh my door')
Out[2]: ['oh', 'my', 'door']
In [3]: dark('Ah my door')
Out[3]: ['Ah', 'my', 'door']
In [4]: dark('Ah my shoulder')
Out[4]: ['Ah', 'my', 'shoulder']
In [5]: Try(lambda: dark('Fucking comming'), err=Func.idp)
Out[5]:
<string>:0:1: All 2 branch failed
[] (Fucking)
这里你可以看到,MontagePY 里的 parser 是 PEG 文法的,不必拘泥于一个两个字符,如果超过一个项目的组合失败了,自然会 reset 到原位负责地重试到完成def accept(self, ins):唉,不知道什么时候 auxfun 不是 module 了,真是莫名其妙,Python 的 class 啊
for parser in self.subs:
with ins.positional():
res0 = Parser.run(parser, ins)
if PsP.matchedq(res0): return PsP.Matched(res0)
ins.eissue(self.errfmt, self.subs, None)
return PsP.Unmatched
所谓的『灵活』,有时候也不过尔尔,还不如自动多态呢
GitHub
duangsuse-valid-projects/MontagePY
:thinking: Montage image generator. Contribute to duangsuse-valid-projects/MontagePY development by creating an account on GitHub.
Java 的
其实这个封装是管得太宽了,我还刻意弄来
只好重写这个模块了
我的本意只是写一些可以组合的解析器(
InputStream 和 DataInput 都没有记录 Position,或许是为了性能吧(笑),但我觉得必须有……其实这个封装是管得太宽了,我还刻意弄来
Ring.kt (环形缓冲区)的代码来写…… 现在看来即使是写好了也感觉很差劲只好重写这个模块了
我的本意只是写一些可以组合的解析器(
Struct),额外去弄这些有点不合适……dokuss.zip
4.5 KB
绝版了,绝对不会再写 RecovableStream,我会直接让使用者 Fully buffered (
BufferedInputStream)Forwarded from dnaugsuz
@Autowired与Kotlin在@Service中始终为null - 程序园这语言安排得还真是漂亮…… 我还以为 Kotlin 这个『右值』能是
null 呢,或者 Kotlin 和 @Autowired 一门语言一个 annotation class 在 @Service 这个 annotation class 里皆为空,Java 与您。不是有 kotlin 的 all-open compiler plugin 吗
apply plugin: 'application'
apply plugin: 'kotlin-spring'
apply plugin: 'kotlin-jpa'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
classpath "org.jetbrains.kotlin:kotlin-${it}:${kotlinVersion}".toString()
for it in ['gradle-plugin', 'allopen', 'noarg']
where kotlinVersion = '1.3.+'
Forwarded from dnaugsuz
难道不应该吗,它还不需要你
比如哪一天有一个用户清奇遭到了 Exception safety 问题,本来是你扣他的工资、给他虚拟物品
在操作皆无原子性(一定会一起失败,不存在中间情况)的时候 (p0: 扣钱; p1: 发货)
+ 要么是你白扣他的钱,然后什么也没说(强盗!),这是 p1 => p0; 反过来就不行
+ 要么是你亏大了(白送),这是 p1 =/> p0,发货肯定扣钱,但是可能被投诉的情况
而有原子性的话处理方便很多,在单机面向用户的时候这肯定很方便啊,不过我觉得可以直接写成函数包起来复用最好,然后就可以用 annotation+kapt 什么的,就不会一定要
try (db.transactional()) {...}...比如哪一天有一个用户清奇遭到了 Exception safety 问题,本来是你扣他的工资、给他虚拟物品
在操作皆无原子性(一定会一起失败,不存在中间情况)的时候 (p0: 扣钱; p1: 发货)
+ 要么是你白扣他的钱,然后什么也没说(强盗!),这是 p1 => p0; 反过来就不行
+ 要么是你亏大了(白送),这是 p1 =/> p0,发货肯定扣钱,但是可能被投诉的情况
而有原子性的话处理方便很多,在单机面向用户的时候这肯定很方便啊,不过我觉得可以直接写成函数包起来复用最好,然后就可以用 annotation+kapt 什么的,就不会一定要
transactional {...} 包裹了Forwarded from dnaugsuz
try (...: Closeable) { taskRepo.deleteTask(id) } 怎么样呢,虽然不是表达式…… 噢不对 Kotlin 里 try... 是表达式byCaptureTaskId 的
capture 是什么意思... SQL 语句的 parameter bind?Forwarded from dnaugsuz
日卡卡好像写过 sh 脚本来允许利用
app_process 和 android.os.Looper.prepareMainLooper 的 Java service 以 root 执行,不需要很多指令,就是先 kill by name 杀旧服务,然后 su exec 替换掉 shell 就可以了,具体代码可在 GitHub 找 Shizuku manager,貌似有(应该是 Yuuta 个人博客文章看到的)Forwarded from dnaugsuz
严正怀疑是 Kotlin 语言定义有 bug,为什么我不加括号你说没有
companion object 加上你说找不到这个类 (欸第一张图好像发错了…… 😂)