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

如何高效优雅的解析类似下面的表达式

  •  
  •   my3157 · 2017-08-21 13:48:09 +08:00 · 2737 次点击
    这是一个创建于 2645 天前的主题,其中的信息可能已经有所发展或是发生改变。

    优雅 + 高效

    其中, arch os id 为变量

    arch=x86 and ( os=linux or os=darwin ) or id>20
    
    !(os=windows)
    

    需要支持常见逻辑判断, 如下:

    = 相等
    > 大于
    >= 大于或等于
    < 小余
    <= 小余或等于
    != 不等于
    ! 取反
    

    表达式从左到右解析, 遇到 () 先解析

    以上的基础上, 如何加入内置函数支持, 如下:

    len(os)=5 // 字符串 os 长度为 5
    
    3 条回复    2017-08-21 16:01:08 +08:00
    my3157
        1
    my3157  
    OP
       2017-08-21 14:05:29 +08:00
    有做过类似的功能的童鞋么? 给个思路
    Kilerd
        2
    Kilerd  
       2017-08-21 14:12:41 +08:00 via iPhone
    请复习编译原理等相关课程。

    文法不会很难啊
    my3157
        3
    my3157  
    OP
       2017-08-21 16:01:08 +08:00
    @Kilerd 初步想法是构建一个 tree, 从左到右解析, 数据结构大致如下:

    ```
    type Express struct {
    Left *Express
    Operation Operation
    Right *Express
    }
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3310 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:48 · PVG 08:48 · LAX 16:48 · JFK 19:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.