Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jison:为和或生成具有多个子节点的AST节点_Javascript_Sql_Parsing_Jison - Fatal编程技术网

Javascript Jison:为和或生成具有多个子节点的AST节点

Javascript Jison:为和或生成具有多个子节点的AST节点,javascript,sql,parsing,jison,Javascript,Sql,Parsing,Jison,我正在用JavaScript编写一个简单的SQL-to-Mongo查询条件生成程序。 我使用Jison解析SQL的where子句 下面的语法以二叉树的形式返回一个AST,其中ORs和and是嵌套的。 我想要的是获得一个AST,其中OR节点具有单个节点(平面树)中的所有术语 它回来了 { "or": [ { "or": [ { "or": [ { "var": "a",

我正在用JavaScript编写一个简单的SQL-to-Mongo查询条件生成程序。 我使用Jison解析SQL的where子句

下面的语法以二叉树的形式返回一个AST,其中ORs和and是嵌套的。 我想要的是获得一个AST,其中OR节点具有单个节点(平面树)中的所有术语

它回来了

{
  "or": [
    {
      "or": [
        {
          "or": [
            {
              "var": "a",
              "op": "=",
              "val": "1"
            },
            {
              "var": "b",
              "op": "=",
              "val": "2"
            }
          ]
        },
        {
          "var": "c",
          "op": "=",
          "val": "3"
        }
      ]
    },
    {
      "var": "d",
      "op": "=",
      "val": "4"
    }
  ]
}
但我希望它能回来

{
  "or": [
    {
      "var": "a",
      "op": "=",
      "val": "1"
    },
    {
      "var": "b",
      "op": "=",
      "val": "2"
    },
    {
      "var": "c",
      "op": "=",
      "val": "3"
    },
    {
      "var": "d",
      "op": "=",
      "val": "4"
    }
  ]
}

使用Jison可能吗?如果是这样,需要做哪些更改?

您只需要修复这些操作

首先,将
search\u条件
规则中的操作更改如下:

search_condition
    : search_condition OR boolean_term
        { $1['or'].push($3); $$ = $1; }
    | boolean_term
        { $$ = { 'or': [ $1 ] }; }
    ;
这可确保
搜索\u条件
始终生成
节点,即使该节点仅包含一个元素。由于基本生产创建(单数)
节点,递归生产可以自由附加到它

如果要清除退化的
节点(在
搜索条件
不包含
运算符的情况下),可以在包装器中(或直接在开始生产时)执行此操作:

{
  "or": [
    {
      "var": "a",
      "op": "=",
      "val": "1"
    },
    {
      "var": "b",
      "op": "=",
      "val": "2"
    },
    {
      "var": "c",
      "op": "=",
      "val": "3"
    },
    {
      "var": "d",
      "op": "=",
      "val": "4"
    }
  ]
}
search_condition
    : search_condition OR boolean_term
        { $1['or'].push($3); $$ = $1; }
    | boolean_term
        { $$ = { 'or': [ $1 ] }; }
    ;
start
    :  simplified_search_condition EOF
       { return $1; }
    ;

simplified_search_condition
    :  search_condition EOF
       { $$ = $1['or'].length == 1 ? $1['or'] : $1; }
    ;