1use crate::lexer::PtxToken;
2use std::fmt::{self, Write};
3
4pub struct PtxUnlexer;
7
8impl PtxUnlexer {
9 pub fn write_tokens<W>(writer: &mut W, tokens: &[PtxToken]) -> fmt::Result
11 where
12 W: Write,
13 {
14 for token in tokens {
15 write_token(writer, token)?;
16 }
17 Ok(())
18 }
19
20 pub fn to_string(tokens: &[PtxToken]) -> Result<String, fmt::Error> {
22 let mut buffer = String::new();
23 Self::write_tokens(&mut buffer, tokens)?;
24 Ok(buffer)
25 }
26}
27
28fn write_token<W: Write>(writer: &mut W, token: &PtxToken) -> fmt::Result {
29 match token {
30 PtxToken::Identifier(name)
31 | PtxToken::DecimalInteger(name)
32 | PtxToken::HexInteger(name)
33 | PtxToken::BinaryInteger(name)
34 | PtxToken::OctalInteger(name)
35 | PtxToken::Float(name)
36 | PtxToken::FloatExponent(name)
37 | PtxToken::HexFloatSingle(name)
38 | PtxToken::HexFloatDouble(name)
39 | PtxToken::Register(name) => writer.write_str(name),
40 PtxToken::StringLiteral(name) => {
41 writer.write_char('"')?;
42 writer.write_str(name)?;
43 writer.write_char('"')
44 }
45 PtxToken::Dot => writer.write_char('.'),
46 PtxToken::Comma => writer.write_char(','),
47 PtxToken::Semicolon => writer.write_char(';'),
48 PtxToken::Colon => writer.write_char(':'),
49 PtxToken::DoubleColon => writer.write_str("::"),
50 PtxToken::LParen => writer.write_char('('),
51 PtxToken::RParen => writer.write_char(')'),
52 PtxToken::LBracket => writer.write_char('['),
53 PtxToken::RBracket => writer.write_char(']'),
54 PtxToken::LBrace => writer.write_char('{'),
55 PtxToken::RBrace => writer.write_char('}'),
56 PtxToken::Plus => writer.write_char('+'),
57 PtxToken::Minus => writer.write_char('-'),
58 PtxToken::Star => writer.write_char('*'),
59 PtxToken::Slash => writer.write_char('/'),
60 PtxToken::LAngle => writer.write_char('<'),
61 PtxToken::RAngle => writer.write_char('>'),
62 PtxToken::Equals => writer.write_char('='),
63 PtxToken::Percent => writer.write_char('%'),
64 PtxToken::Exclaim => writer.write_char('!'),
65 PtxToken::Pipe => writer.write_char('|'),
66 PtxToken::Ampersand => writer.write_char('&'),
67 PtxToken::Caret => writer.write_char('^'),
68 PtxToken::Tilde => writer.write_char('~'),
69 PtxToken::At => writer.write_char('@'),
70 PtxToken::Space => writer.write_char(' '),
71 PtxToken::Newline => writer.write_char('\n'),
72 }
73}