微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解析复杂的JavaScript表达式以另一种格式重写它

我想我会因为问这个问题而被嘲笑,但是哦.

我正在尝试重构遗留应用程序,其中存在数据库中的数据列中的JavaScript表达式中存在验证和条件呈现逻辑.表达式本质上是布尔值,但有些是相当复杂的.一个例子是:

([!Var6!] == '4' || [!Var6!] == '5' || [!Var6!] == '6') && ([!Var1!] == '2' || [!Var2!] >= 65 || [!Var3!] == '5' || [!Var4!] == '6')

… [!…!]表示法表示存储在JavaScript中的变量.

我需要在我的C#应用​​程序中将其转换为结构化JSON中更有序的格式以提供另一个应用程序,这类似于下面的符号.表达式的复杂性使得我无法使用自己的解析器…所以我希望有一种方法可以让别人已经写过,或者在Visual Studio中有一个我不知道的巧妙技巧或.NET框架来解析这个烂摊子.

{
    "condition": { // expression object
        "expressions": [
            { //expression object representing ([!Var6!] == '4' || [!Var6!] == '5' || [!Var6!] == '6')
                "expressions": [
                    { //expression object representing [!Var6!] == '4'
                        "left_operand": {
                            "type": "variable","value": "Var6"
                        },"operator": "eq","right_operand": {
                            "type": "numeric","value": 4
                        }
                    },{ //expression object representing [!Var6!] == '5'
                        "left_operand": {
                            "type": "variable","value": 5
                        }
                    },{ //expression object representing [!Var6!] == '6'
                        "left_operand": {
                            "type": "variable","value": 6
                        }
                    }
                ],"logical_operation": "or"
            },{ //expression object representing ([!Var1!] == '2' || [!Var2!] >= 65 || [!Var3!] == '5' || [!Var4!] == '6')
                "expressions": [
                    { //expression representing [!Var1!] == '2'
                        "left_operand": {
                            "type": "variable","value": "Var1"
                        },"value": 2
                        }
                    },{ //expression representing [!Var2!] >= 65
                        "left_operand": {
                            "type": "variable","value": "Var2"
                        },"operator": "gte","value": 65
                        }
                    },{ //expression representing [!Var3!] == '5'
                        "left_operand": {
                            "type": "variable","value": "Var3"
                        },{ //expression representing [!Var4!] == '6'
                        "left_operand": {
                            "type": "variable","value": "Var4"
                        },"logical_operation": "or"
            }
        ],"logical_operation": "and"
    }

解决方法

所以第一个也许是主要问题是将javascript表达式转换为AST,然后可以进一步处理.

使用其中一个开源解析器来获取AST.

我建议使用typescript编译器,因为它有一个非常干净的代码库(有效的javascript总是有效的typescript). Uglify也非常适合,其作者保持有关处理AST的非常好的信息.

> https://github.com/Microsoft/TypeScript/tree/master/src/compiler
> http://lisperator.net/uglifyjs/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐