Skip to main content

ptx_parser/
unlexer.rs

1use crate::lexer::PtxToken;
2use std::fmt::{self, Write};
3
4/// Utility that performs the inverse of the lexer: it writes textual PTX for a
5/// sequence of [`PtxSpecToken`] values.
6pub struct PtxUnlexer;
7
8impl PtxUnlexer {
9    /// Write the textual PTX representation of `tokens` to `writer`.
10    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    /// Convenience helper that produces a PTX string for `tokens`.
21    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}