Random Posts
Tags
Categories
Recent Comments
- 小肥 on GDB 从裸奔到穿戴整齐
- flandre on 异步事件模型的 Self-pipe trick
- inv on 异步事件模型的 Self-pipe trick
- skywind on 异步事件模型的 Self-pipe trick
- skywind on 异步事件模型的 Self-pipe trick
Links
Meta
Monthly Archives: January 2023
使用 LIBLR 解析带注释的 JSON
前文《基于 LR(1) 和 LALR 的 Parser Generator》里介绍了春节期间开发的小玩具 LIBLR ,今天春节最后一天,用它跑一个小例子,解析带注释的 json 文件。由于 python 自带 json 库不支持带注释的 json 解析,而 vscode 里大量带注释的 json 没法解析,所以我们先写个文法,保存为 json.txt: # 定义两个终结符 %token NUMBER %token STRING start: value {get1} ; value: object {get1} | array {get1} | STRING … Continue reading
基于 LR(1) 和 LALR 的 Parser Generator
最近处理文本比较多,先前想增强下正则,看来不够用了,有同学推荐了我 Pyl 和 Lark,看了两眼,初看还行,但细看有一些不太喜欢的地方,于是刚好春节几天有空,从头写了一个 LR(1) / LALR 的 Generator,只有一个 LIBLR.py 的单文件,没有其它依赖: GitHub – skywind3000/LIBLR: Parser Generator for LR(1) and LALR 用法很简单,给定文法,返回 Parser: import LIBLR # 注意这里是 r 字符串,方便后面写正则 # 所有词法规则用 @ 开头,从上到下依次匹配 grammar = r”’ start: WORD ‘,’ WORD ‘!’; … Continue reading
Python 中使用组合方式构建复杂正则
正则写复杂了很麻烦,难写难调试,只需要两个函数,就能用简单正则组合构建复杂正则: 比如输入一个字符串规则,可以使用 {name} 引用前面定义的规则: # rules definition rules = r”’ protocol = http|https login_name = [^:@\r\n\t ]+ login_pass = [^@\r\n\t ]+ login = {login_name}(:{login_pass})? host = [^:/@\r\n\t ]+ port = \d+ optional_port = (?:[:]{port})? path = /[^\r\n\t ]* url = … Continue reading