Rust 如何在标记化期间返回不同的标记?

Rust 如何在标记化期间返回不同的标记?,rust,Rust,我正在用Rust编写一个编译器,给定一个字符串,部分逻辑是找出字符的“种类” 我想返回每个字符的“值”。对于1+2的输入,每个字符都有一个“标记”,并且应该返回如下内容: NumberToken,1 WhiteSpaceToken,' PlusToken,“+” WhiteSpaceToken,' NumberToken,1 我的函数应该返回如下内容 enum SyntaxKind{ NumberToken, 空白标记, 普卢斯托克 } 结构SyntaxToken{ 种类:SyntaxKin

我正在用Rust编写一个编译器,给定一个字符串,部分逻辑是找出字符的“种类”

我想返回每个字符的“值”。对于
1+2
的输入,每个字符都有一个“标记”,并且应该返回如下内容:

  • NumberToken
    1
  • WhiteSpaceToken
    '
  • PlusToken
    “+”
  • WhiteSpaceToken
    '
  • NumberToken
    1
我的函数应该返回如下内容

enum SyntaxKind{
NumberToken,
空白标记,
普卢斯托克
}
结构SyntaxToken{
种类:SyntaxKind,
值://某种通用类型
}
fn next_标记(行:字符串)->SyntaxToken{
//逻辑就在这里
}
我将如何实现这种逻辑?

如果您正在编写一个标记器,并且您想知道这种逻辑可能是什么样子,那么您可以在相同的
枚举中耦合这些值,例如:

#[派生(调试)]
枚举令牌{
添加
附属的,
空白,
编号(f64),
}
有关详细信息,请参见关于向变体添加数据

…然后您可以在迭代器内部使用
匹配
来相应地处理它:

#[派生(调试)]
枚举令牌{
添加
附属的,
空白,
编号(f64),
}
使用std::str::Chars;
使用std::iter::Peekable;
结构标记>,
}
发布类型令牌迭代器>;
恳求{
pub fn new(s:&'a str)->令牌迭代器{
自我{
来源:s.chars().peek(),
}
.peakable()
}
}
恳求{
类型项=令牌;
fn下一步(&mut self)->选项{
匹配self.source.next(){
Some(“”)=>Some(标记::空格),
Some(+')=>Some(Token::Add),
Some('-')=>Some(Token::Sub),
n@Some('0'…='9')=>{
让mut number=String::from(n.unwrap());
而让Some(n)=self.source.next_if(char::is_ascii_digit){
推送次数(n);
}
一些(令牌::编号(Number.parse::().unwrap())
}
有些()=>未执行!(),
无=>无,
}
}
}
fn main(){
让tokens=tokens::new(“1+2”);
代币中的代币{
println!(“{:?}”,标记);
}
}
这样,您就可以:

编号(1.0)
空白
添加
空白
数字(2.0)

如果您正在编写一个标记器,并且您想知道这样的逻辑可能是什么样子,那么您可以在同一个
枚举中耦合这些值,例如:

#[派生(调试)]
枚举令牌{
添加
附属的,
空白,
编号(f64),
}
有关详细信息,请参见关于向变体添加数据

…然后您可以在迭代器内部使用
匹配
来相应地处理它:

#[派生(调试)]
枚举令牌{
添加
附属的,
空白,
编号(f64),
}
使用std::str::Chars;
使用std::iter::Peekable;
结构标记>,
}
发布类型令牌迭代器>;
恳求{
pub fn new(s:&'a str)->令牌迭代器{
自我{
来源:s.chars().peek(),
}
.peakable()
}
}
恳求{
类型项=令牌;
fn下一步(&mut self)->选项{
匹配self.source.next(){
Some(“”)=>Some(标记::空格),
Some(+')=>Some(Token::Add),
Some('-')=>Some(Token::Sub),
n@Some('0'…='9')=>{
让mut number=String::from(n.unwrap());
而让Some(n)=self.source.next_if(char::is_ascii_digit){
推送次数(n);
}
一些(令牌::编号(Number.parse::().unwrap())
}
有些()=>未执行!(),
无=>无,
}
}
}
fn main(){
让tokens=tokens::new(“1+2”);
代币中的代币{
println!(“{:?}”,标记);
}
}
这样,您就可以:

编号(1.0)
空白
添加
空白
数字(2.0)

你的问题是什么?你是在要求为
//逻辑在这里运行
]编写代码吗?我试图找到一些类似“Object”类型的代码,它在其他语言(如Java)中也有。抱歉,我不太清楚您的问题是什么?您是否要求为
//逻辑在这里运行
]编写代码?我试图找到一些类似“Object”类型的代码,它在其他语言(如Java)中也有。抱歉没有弄清楚这是一个很好的猜测(而且是一个有用的贡献,我投了更高的票),但几乎可以肯定这是一个猜测,问题不是很清楚…这正是我想要的,谢谢你,抱歉没有弄清楚。我很高兴我能对@ianprogrammer有所帮助。我试着为未来的读者澄清你文章的一些部分,但也许其他人也可以插话。就我而言,回答这个问题很有趣。这是一个很好的猜测(也是一个有用的贡献,我投了更高的票),但几乎可以肯定这是一个猜测,这个问题不是很清楚……这正是我想要的,谢谢你,很抱歉我不清楚。我很高兴我能对@ianprogrammer有所帮助。我试着为未来的读者澄清你文章的一些部分,但也许其他人也可以插话。就我而言,回答这个问题很有趣。