一个老项目用了这种规则描述设备的参数, 请问:应该用什么思路解析? 引申:json,xml 这种文本的解析算法有什么共性?
#deviceLamp*灯光
1,3,4,1,100,0,0,1,吊灯
1,3,4,2,0,0,0,0,台灯
1,3,4,3,100,0,0,1,壁灯
#Enddevice
#deviceLightScreen*灯光模式
1,1,0
#Enddevice
#deviceLightObject*1
#Enddevice
#deviceCurtain*窗帘
1,南窗,1,1
2,西窗,2,1
#Enddevice
#deviceCurtainObject*1
开,1,4,3,0,1
关,0,4,3,0,2
停,0,4,3,0,0
#Enddevice
#deviceCurtainObject*2
开,1,4,3,1,1
关,1,4,3,1,2
停,1,4,3,1,0
#Enddevice
目的大概是输出这样的结构
"modules": [
{
"type": "灯",
"devices": [
{"name":"吊灯", "cmd": [1,3,4,1,100,0,0,1]},
{"name":"台灯", "cmd": [1,3,4,2,0,0,0,0]}
]
},
{
"type": "窗帘",
"devices": [
{"name":"南窗", "cmd": {"开": [1,4,3,0,1], "关": [0,4,3,0,2], "停": [0,4,3,0,0],}},
{"name":"西窗", "cmd": {"开": [1,4,3,0,1], "关": [0,4,3,0,2], "停": [0,4,3,0,0],}}
]
},
]
1
shoaly 2017-06-21 18:48:58 +08:00
正则
|
2
lnim 2017-06-21 18:58:16 +08:00
楼上+1
|
3
mcfog 2017-06-21 19:03:48 +08:00
去看下编译原理吧
或者这种几乎不需要什么 lexer 的格式,简单看下状态机相关的东西就很容易手写 laser 了 |
4
SlipStupig 2017-06-21 19:15:53 +08:00
判断每一行的汉字,如果是开 /关 /停就写到参数里面,然后剩余的全是参数,如果匹配不到就无法描述。
用正则+map 最合适不过了 |
5
guyskk 2017-06-21 20:42:13 +08:00
这个没有嵌套,规则也很简单,直接按行读取,正则+逗号分割就行了。
|
6
raiz OP |
7
secondwtq 2017-06-22 00:11:19 +08:00 via Android
共性?我觉得是递归
顺便简单格式要求不高的话,有个贼好用的东西叫 parser combinator |
8
neoblackcap 2017-06-22 00:19:04 +08:00
同意 @secondwtq 的观点,若是对性能要求不高的话,parser combinator 还是一个很不错的选择,快速有效解决问题。
|
9
nicevar 2017-06-22 07:33:48 +08:00 via iPhone
应用场景不大自己写个简单的解析就行了,也不是什么老设备问题,偏硬件底层方面基本上都这样写,比如一些 LED 灯驱动和 TV 启动配置程序
|
10
araraloren 2017-06-22 09:02:29 +08:00
简单的需求就直接硬解析就行了。。 就像 5 楼说的,直接分隔,提取,简单正则就解决了
|
11
RubyJack 2017-06-22 10:19:55 +08:00
我觉得按行分割一下就可以处理了...简单粗暴
|