- if self.iter.next_if_eq(&':').is_some() {
- Token::Label(s)
- } else if s.starts_with('@') {
- Token::At(s)
- } else if let Some(count) = s.strip_prefix('s') {
- Token::S(
- count
- .parse()
- .map_err(|msg| anyhow!("bad counted string '{s}' ({msg})"))?,
- )
- } else {
- match &s[..] {
- "i8" => Token::I8,
- "i16" => Token::I16,
- "i64" => Token::I64,
- "SYSMIS" => Token::Float(OrderedFloat(-f64::MAX)),
- "PCSYSMIS" => Token::PcSysmis,
- "LOWEST" => Token::Float((-f64::MAX).next_after(0.0).into()),
- "HIGHEST" => Token::Float(f64::MAX.into()),
- "ENDIAN" => Token::Integer(if self.endian == Endian::Big { 1 } else { 2 }),
- "COUNT" => Token::Count,
- "COUNT8" => Token::Count8,
- "hex" => Token::Hex,
- _ => return Err(anyhow!("invalid token '{s}'")),
+ ';' => Token::Semicolon,
+ '*' => Token::Asterisk,
+ '+' => Token::Plus,
+ '(' => Token::LParen,
+ ')' => Token::RParen,
+ c if c.is_alphabetic() || c == '@' || c == '_' => {
+ let mut s = String::from(c);
+ while let Some(c) = self.iter.next_if(|&c| {
+ c.is_ascii_digit() || c.is_alphabetic() || c == '.' || c == '_'
+ }) {
+ s.push(c);
+ }
+ if self.iter.next_if_eq(&':').is_some() {
+ Token::Label(s)
+ } else if s.starts_with('@') {
+ Token::At(s)
+ } else if let Some(count) = s.strip_prefix('s') {
+ Token::S(count.parse().map_err(|msg| {
+ self.error(format!("bad counted string '{s}' ({msg})"))
+ })?)
+ } else {
+ match &s[..] {
+ "i8" => Token::I8,
+ "i16" => Token::I16,
+ "i64" => Token::I64,
+ "SYSMIS" => Token::Float(OrderedFloat(-f64::MAX)),
+ "PCSYSMIS" => Token::PcSysmis,
+ "LOWEST" => Token::Float((-f64::MAX).next_after(0.0).into()),
+ "HIGHEST" => Token::Float(f64::MAX.into()),
+ "ENDIAN" => {
+ Token::Integer(if self.endian == Endian::Big { 1 } else { 2 })
+ }
+ "COUNT" => Token::Count,
+ "COUNT8" => Token::Count8,
+ "hex" => Token::Hex,
+ _ => Err(self.error(format!("invalid token '{s}'")))?,
+ }