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