修改下面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! 明确指明了三组规则的匹配优先顺序

  • 上面的定义表示:

    1. 如果能匹配 SegmentsWrap . BoolFunction,就一定优先匹配这条。
    2. 否则再匹配 < > <= >= = <> 等比较。
    3. 否则再尝试括号嵌套或单独的 BoolFunction

如果你后续还需要控制运算符之间的优先级(如 AND, OR, NOT),也可以用类似结构再嵌套 precedence!

需要我一并整理 BoolExpression 的优先级也可以告诉我。

posted on 2025-06-01 16:37  及途又八  阅读(10)  评论(0)    收藏  举报

导航