修改下面BoolFactory的语法规则定义,第一条规则优先级最高,当第一条规则能被解析时则按其规则执行,否则再按下面的规则执行。
修改下面BoolFactory的语法规则定义,第一条规则优先级最高,当第一条规则能被解析时则按其规则执行,否则再按下面的规则执行。
BoolFactory: AstBoolFactory = {
<segs_wrap:SegmentsWrap> "." <bool_fn: BoolFunction> => {
todo!("<<< MDX Grammar Exception >>> BoolFactory SegmentsWrap not implemented yet.")
},
<exp_left: Expression> "<" <exp_right: Expression> => {
AstBoolFactory::ExpressionComparesAnother(exp_left, String::from("<"), exp_right)
},
<exp_left: Expression> "<=" <exp_right: Expression> => {
AstBoolFactory::ExpressionComparesAnother(exp_left, String::from("<="), exp_right)
},
<exp_left: Expression> "=" <exp_right: Expression> => {
AstBoolFactory::ExpressionComparesAnother(exp_left, String::from("="), exp_right)
},
<exp_left: Expression> "<>" <exp_right: Expression> => {
AstBoolFactory::ExpressionComparesAnother(exp_left, String::from("<>"), exp_right)
},
<exp_left: Expression> ">" <exp_right: Expression> => {
AstBoolFactory::ExpressionComparesAnother(exp_left, String::from(">"), exp_right)
},
<exp_left: Expression> ">=" <exp_right: Expression> => {
AstBoolFactory::ExpressionComparesAnother(exp_left, String::from(">="), exp_right)
},
"(" <bool_exp: BoolExpression> ")" => {
AstBoolFactory::BoolExp(Box::new(bool_exp))
},
<bool_fn: BoolFunction> => {
AstBoolFactory::BoolFn(bool_fn)
}
}
eeeeeeeeeeeeeeeeeeeeeeeeeeeee
你希望将 BoolFactory
的第一条规则:
<segs_wrap:SegmentsWrap> "." <bool_fn: BoolFunction> => { ... }
设为 优先级最高,即当能匹配这条规则时就不再尝试其他规则。
在 LALRPOP 中可以使用 precedence!
块来实现你要的 优先匹配控制(优先级)。下面是重写后的版本:
✅ 修改后的 BoolFactory
定义:
BoolFactory: AstBoolFactory = {
precedence! {
// 第一优先级(最高)
N {
<segs_wrap:SegmentsWrap> "." <bool_fn: BoolFunction> => {
todo!("<<< MDX Grammar Exception >>> BoolFactory SegmentsWrap not implemented yet.")
},
}
// 第二优先级(比较表达式)
N {
<exp_left: Expression> "<" <exp_right: Expression> => AstBoolFactory::ExpressionComparesAnother(exp_left, String::from("<"), exp_right),
<exp_left: Expression> "<=" <exp_right: Expression> => AstBoolFactory::ExpressionComparesAnother(exp_left, String::from("<="), exp_right),
<exp_left: Expression> "=" <exp_right: Expression> => AstBoolFactory::ExpressionComparesAnother(exp_left, String::from("="), exp_right),
<exp_left: Expression> "<>" <exp_right: Expression> => AstBoolFactory::ExpressionComparesAnother(exp_left, String::from("<>"), exp_right),
<exp_left: Expression> ">" <exp_right: Expression> => AstBoolFactory::ExpressionComparesAnother(exp_left, String::from(">"), exp_right),
<exp_left: Expression> ">=" <exp_right: Expression> => AstBoolFactory::ExpressionComparesAnother(exp_left, String::from(">="), exp_right),
}
// 第三优先级(括号和 BoolFunction)
N {
"(" <bool_exp: BoolExpression> ")" => AstBoolFactory::BoolExp(Box::new(bool_exp)),
<bool_fn: BoolFunction> => AstBoolFactory::BoolFn(bool_fn),
}
}
};
✅ 效果解释:
-
使用
precedence!
明确指明了三组规则的匹配优先顺序。 -
上面的定义表示:
- 如果能匹配
SegmentsWrap . BoolFunction
,就一定优先匹配这条。 - 否则再匹配
< > <= >= = <>
等比较。 - 否则再尝试括号嵌套或单独的
BoolFunction
。
- 如果能匹配
如果你后续还需要控制运算符之间的优先级(如 AND
, OR
, NOT
),也可以用类似结构再嵌套 precedence!
。
需要我一并整理 BoolExpression
的优先级也可以告诉我。