修改上面函数,忽略大小写
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") 会匹配 SELECT、select、SeLeCt 等形式的输入。
示例:
在这种修改下,"select"、"FROM"、"Where" 都会被正确解析为对应的 Token::Keyword 枚举。
这样,测试时你可以使用任何大小写形式的关键字,nom 会忽略大小写并正确匹配。
浙公网安备 33010602011771号