我想我会因为问这个问题而被嘲笑,但是哦.
我正在尝试重构遗留应用程序,其中存在数据库中的数据列中的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,然后可以进一步处理.
我建议使用typescript编译器,因为它有一个非常干净的代码库(有效的javascript总是有效的typescript). Uglify也非常适合,其作者保持有关处理AST的非常好的信息.
> https://github.com/Microsoft/TypeScript/tree/master/src/compiler
> http://lisperator.net/uglifyjs/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。