use logos::Logos;
#[derive(Logos, Debug, PartialEq, Clone)]
#[logos(skip r"[ \t\n\f]+")]
#[logos(skip r"//.*")]
pub enum Token<'a> {
#[token("HOST")]
Host,
#[token("FLOW")]
Flow,
#[token("IP")]
Ip,
#[token("MAC")]
Mac,
#[token("COMPILE")]
Compile,
#[token("LOOP")]
Loop,
#[token("TCP")]
Tcp,
#[token("UDP")]
Udp,
#[token("SYN")]
Syn,
#[token("ACK")]
Ack,
#[token("FIN")]
Fin,
#[token("RST")]
Rst,
#[token("PSH")]
Psh,
#[token("URG")]
Urg,
#[token("ECE")]
Ece,
#[token("CWR")]
Cwr,
#[token("SRCPORT")]
SrcPort,
#[token("DSTPORT")]
DstPort,
#[token("PORT")]
Port,
#[token("SEQ")]
Seq,
#[token("ACKNUM")]
AckNum,
#[token("WIN")]
Win,
#[token("PAYLOAD")]
Payload,
#[token("WAIT")]
Wait,
#[token("SNMP1")]
Snmp1,
#[token("SNMP2")]
Snmp2,
#[token("SNMP3")]
Snmp3,
#[token("TRAP")]
Trap,
#[token("GET")]
Get,
#[token("SET")]
Set,
#[token("RESPONSE")]
Response,
#[token("INFORM")]
Inform,
#[token("GETNEXT")]
GetNext,
#[token("GETBULK")]
GetBulk,
#[token("COMMUNITY")]
Community,
#[token("USER")]
User,
#[token("OID")]
Oid,
#[token("SYSUPTIME")]
SysUpTime,
#[token("VARBIND")]
VarBind,
#[token("NULLVAL")]
NullVal,
#[token("STRING")]
StringVal,
#[token("INT")]
IntVal,
#[token("TIMETICKS")]
TimeTicksVal,
#[token("IPVAL")]
IpVal,
#[token("ENTERPRISE")]
Enterprise,
#[token("AGENTIP")]
AgentIp,
#[token("GENTRAP")]
GenTrap,
#[token("SPECTRAP")]
SpecTrap,
#[token("ENGINEID")]
EngineId,
#[token("ENGINEBOOTS")]
EngineBoots,
#[token("ENGINETIME")]
EngineTime,
#[token("CONTEXTNAME")]
ContextName,
#[token("AUTH")]
Auth,
#[token("PRIV")]
Priv,
#[token("MD5")]
Md5,
#[token("SHA")]
Sha,
#[token("SHA256")]
Sha256,
#[token("SHA384")]
Sha384,
#[token("SHA512")]
Sha512,
#[token("DES")]
Des,
#[token("AES")]
Aes,
#[token("NONREPEATERS")]
NonRepeaters,
#[token("MAXREPETITIONS")]
MaxRepetitions,
#[token("REQID")]
ReqId,
#[token("->")]
RightArrow,
#[token("<-")]
LeftArrow,
#[token("{")]
LBrace,
#[token("}")]
RBrace,
#[token("(")]
LParen,
#[token(")")]
RParen,
#[token(",")]
Comma,
#[token("ms", priority = 2)]
Ms,
#[token("s", priority = 2)]
Sec,
#[token("m", priority = 2)]
Min,
#[regex("[a-zA-Z_][a-zA-Z0-9_]*", priority = 1)]
Ident(&'a str),
#[regex(r#""([^"\\]|\\["\\bnfrt]|u[a-fA-F0-9]{4})*""#)]
StringLit(&'a str),
#[regex(r"[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+", priority = 4)]
IpAddress(&'a str),
#[regex(r"([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}")]
MacAddress(&'a str),
#[regex(r"[0-9]+(\.[0-9]+)+", priority = 5)]
OidStr(&'a str),
#[regex("[0-9]+")]
Number(&'a str),
}
pub fn lex<'a>(
input: &'a str,
) -> Result<alloc::vec::Vec<(Token<'a>, std::ops::Range<usize>)>, crate::error::CompilerError> {
let mut lexer = Token::lexer(input);
let mut tokens = alloc::vec::Vec::new();
while let Some(res) = lexer.next() {
match res {
Ok(token) => tokens.push((token, lexer.span())),
Err(_) => {
return Err(crate::error::CompilerError::LexError {
src: input.to_string(),
span: (lexer.span().start, lexer.span().end - lexer.span().start),
});
}
}
}
Ok(tokens)
}