flycatcher_parser/ast/
opcode.rs

1//! Expression opcodes (such as `+` and `-`) for Flycatcher's parser.
2
3use flycatcher_lexer::Token;
4
5// A list of expression opcodes.
6#[derive(Clone, Copy, Debug, PartialEq)]
7pub enum Opcode {
8
9    /// The == operator.
10    EqualsEquals,
11
12    /// The = operator.
13    Equals,
14
15    /// The > operator.
16    Greater,
17
18    /// The < operator.
19    Less,
20
21    /// The >= operator.
22    GreaterEquals,
23
24    /// The <= operator.
25    LessEquals,
26
27    /// The + operator.
28    Add,
29
30    /// The - operator.
31    Subtract,
32
33    /// The - operator.
34    Multiply,
35
36    /// The / operator.
37    Divide,
38
39}
40
41impl Opcode {
42
43    /// Returns the precidence of this operator.
44    pub fn precedence(&self) -> usize {
45        match self {
46            Opcode::Equals => 0,
47            Opcode::EqualsEquals => 1,
48            Opcode::Greater => 1,
49            Opcode::GreaterEquals => 1,
50            Opcode::Less => 1,
51            Opcode::LessEquals => 1,
52            Opcode::Add => 2,
53            Opcode::Subtract => 2,
54            Opcode::Multiply => 3,
55            Opcode::Divide => 3
56        }
57    }
58
59}
60
61/// Returns whether or not the specified token is an operator that has an Opcode.
62pub fn is_operator(tok: Token) -> bool {
63    match tok {
64        Token::Equals |
65        Token::EqualsEquals |
66        Token::GreaterThan |
67        Token::GreaterThanOrEqual |
68        Token::LessThan |
69        Token::LessThanOrEqual |
70        Token::Plus |
71        Token::Dash |
72        Token::Star |
73        Token::Slash => true,
74        //Token::Percent => true,
75        _ => false
76    }
77}
78
79/// Converts a token to an operator.
80pub fn get_operator(tok: Token) -> Option<Opcode> {
81    Some(match tok {
82        Token::Equals => Opcode::Equals,
83        Token::EqualsEquals => Opcode::EqualsEquals,
84        Token::GreaterThan => Opcode::Greater,
85        Token::LessThan => Opcode::Less,
86        Token::GreaterThanOrEqual => Opcode::GreaterEquals,
87        Token::LessThanOrEqual => Opcode::LessEquals,
88        Token::Plus => Opcode::Add,
89        Token::Dash => Opcode::Subtract,
90        Token::Star => Opcode::Multiply,
91        Token::Slash => Opcode::Divide,
92        _ => return None
93    })
94}