use std::{collections::HashMap, any::Any, error::Error};
use crate::tool::{syntaxis::{chiru_visitor::ChiruVisitor, chiru_context::ElementContext}, grammar::lexer_rule::LexerRule};
pub struct StringLiteralToTokenVisitor {
pub next_token_id: usize,
pub lexer_rule_map: HashMap<String, LexerRule>,
}
impl StringLiteralToTokenVisitor {
fn escape(input: &str) -> String {
input.to_owned()
}
fn regular_escape(input: &str) -> String {
input.to_owned()
}
pub fn new(next_token_id: usize) -> Self {
Self {
next_token_id,
lexer_rule_map: HashMap::new(),
}
}
}
impl ChiruVisitor for StringLiteralToTokenVisitor {
fn visit_element(&mut self, ctx: &dyn ElementContext) -> Result<Box<dyn Any>, Box<dyn Error>> {
if let Some(value) = ctx.string_literal() {
let text = StringLiteralToTokenVisitor::escape(&value.symbol.text);
if self.lexer_rule_map.contains_key(&text) {
return self.default_result();
}
let regular_string = StringLiteralToTokenVisitor::regular_escape(&value.symbol.text);
let lexer_rule = LexerRule::new(
self.next_token_id,
&format!("_T_{}", self.next_token_id),
®ular_string,
0, false
);
self.next_token_id += 1;
self.lexer_rule_map.insert(text, lexer_rule);
}
self.default_result()
}
}