V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
raiz
V2EX  ›  程序员

解析这种文本文件应该用什么思路?

  •  
  •   raiz · 2017-06-21 18:26:01 +08:00 · 2732 次点击
    这是一个创建于 2509 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个老项目用了这种规则描述设备的参数, 请问:应该用什么思路解析? 引申: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
    
    第 1 条附言  ·  2017-06-21 23:05:49 +08:00

    目的大概是输出这样的结构

    "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],}}
    
    					]
    				},
    			]
    
    11 条回复    2017-06-22 10:19:55 +08:00
    shoaly
        1
    shoaly  
       2017-06-21 18:48:58 +08:00
    正则
    lnim
        2
    lnim  
       2017-06-21 18:58:16 +08:00
    楼上+1
    mcfog
        3
    mcfog  
       2017-06-21 19:03:48 +08:00
    去看下编译原理吧

    或者这种几乎不需要什么 lexer 的格式,简单看下状态机相关的东西就很容易手写 laser 了
    SlipStupig
        4
    SlipStupig  
       2017-06-21 19:15:53 +08:00
    判断每一行的汉字,如果是开 /关 /停就写到参数里面,然后剩余的全是参数,如果匹配不到就无法描述。
    用正则+map 最合适不过了
    guyskk
        5
    guyskk  
       2017-06-21 20:42:13 +08:00
    这个没有嵌套,规则也很简单,直接按行读取,正则+逗号分割就行了。
    raiz
        6
    raiz  
    OP
       2017-06-21 23:08:28 +08:00
    @shoaly
    @lnim
    @guyskk 这种简单的应该逐行正则+状态机可以做到。

    @mcfog 用上词法分析的方法估计会优雅点(还没有概念)
    secondwtq
        7
    secondwtq  
       2017-06-22 00:11:19 +08:00 via Android
    共性?我觉得是递归
    顺便简单格式要求不高的话,有个贼好用的东西叫 parser combinator
    neoblackcap
        8
    neoblackcap  
       2017-06-22 00:19:04 +08:00
    同意 @secondwtq 的观点,若是对性能要求不高的话,parser combinator 还是一个很不错的选择,快速有效解决问题。
    nicevar
        9
    nicevar  
       2017-06-22 07:33:48 +08:00 via iPhone
    应用场景不大自己写个简单的解析就行了,也不是什么老设备问题,偏硬件底层方面基本上都这样写,比如一些 LED 灯驱动和 TV 启动配置程序
    araraloren
        10
    araraloren  
       2017-06-22 09:02:29 +08:00
    简单的需求就直接硬解析就行了。。 就像 5 楼说的,直接分隔,提取,简单正则就解决了
    RubyJack
        11
    RubyJack  
       2017-06-22 10:19:55 +08:00
    我觉得按行分割一下就可以处理了...简单粗暴
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2386 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:15 · PVG 19:15 · LAX 04:15 · JFK 07:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.