修改上面函数,忽略大小写

fn keyword(input: &str) -> IResult<&str, Token> {
    alt((
        map(tag("SELECT"), |_| Token::Keyword("SELECT".to_string())),
        map(tag("FROM"), |_| Token::Keyword("FROM".to_string())),
        map(tag("WHERE"), |_| Token::Keyword("WHERE".to_string())),
        map(tag("ON"), |_| Token::Keyword("ON".to_string())),
        map(tag("ROWS"), |_| Token::Keyword("ROWS".to_string())),
        map(tag("COLUMNS"), |_| Token::Keyword("COLUMNS".to_string())),
    ))(input)
}

修改上面函数,忽略大小写

UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
要修改 keyword 函数以忽略大小写,你可以使用 nom 提供的 tag_no_case 函数来替代 tag,它会在匹配时忽略字符的大小写。

修改后的 keyword 函数如下:

use nom::{
    branch::alt,
    bytes::complete::tag_no_case,
    combinator::map,
    IResult,
};

// Token 枚举类型
#[derive(Debug, PartialEq)]
pub enum Token {
    Keyword(String),
    Whitespace, // 空白符
}

fn keyword(input: &str) -> IResult<&str, Token> {
    alt((
        map(tag_no_case("SELECT"), |_| Token::Keyword("SELECT".to_string())),
        map(tag_no_case("FROM"), |_| Token::Keyword("FROM".to_string())),
        map(tag_no_case("WHERE"), |_| Token::Keyword("WHERE".to_string())),
        map(tag_no_case("ON"), |_| Token::Keyword("ON".to_string())),
        map(tag_no_case("ROWS"), |_| Token::Keyword("ROWS".to_string())),
        map(tag_no_case("COLUMNS"), |_| Token::Keyword("COLUMNS".to_string())),
    ))(input)
}

主要更改:

  • 使用 tag_no_case 替换了 tag,它会忽略输入字符串和匹配关键词的大小写差异。

例如,tag_no_case("SELECT") 会匹配 SELECTselectSeLeCt 等形式的输入。

示例:

在这种修改下,"select""FROM""Where" 都会被正确解析为对应的 Token::Keyword 枚举。

这样,测试时你可以使用任何大小写形式的关键字,nom 会忽略大小写并正确匹配。

posted on 2024-12-27 12:31  及途又八  阅读(10)  评论(0)    收藏  举报

导航