valkyrie-antlr 0.0.1

The hand write parser of valkyrie language
Documentation
mod extractors;
mod visitor;
use crate::{
    antlr::{
        valkyrieantlrlexer::ValkyrieAntlrLexer,
        valkyrieantlrlistener::ValkyrieAntlrListener,
        valkyrieantlrparser::{self, *},
        valkyrieantlrvisitor::ValkyrieAntlrVisitor,
    },
    traits::Extractor,
};
use antlr_rust::{
    common_token_stream::CommonTokenStream,
    errors::ANTLRError,
    parser::ParserNodeType,
    parser_rule_context::ParserRuleContext,
    token::Token,
    tree::{ParseTree, ParseTreeListener, ParseTreeVisitorCompat, TerminalNode, Tree, VisitChildren, VisitableDyn},
    CoerceTo, InputStream, TidExt,
};
use std::{ops::Range, rc::Rc};
use valkyrie_ast::{
    ClassDeclaration, ClassFieldDeclaration, ClassKind, ExpressionNode, ExpressionType, FlagsDeclaration, ForLoop,
    IdentifierNode, InfixNode, LetPattern, LogicMatrix, ModifiersNode, NamePathNode, NamespaceDeclaration, NamespaceKind,
    NumberLiteralNode, OperatorNode, PostfixNode, PrefixNode, ProgramRoot, StatementNode, StatementType, UnionDeclaration,
    ValkyrieOperator,
};

#[derive(Clone, Debug, Default)]
pub struct ValkyrieProgramParser {
    statements: Vec<StatementNode>,
}

impl ValkyrieProgramParser {
    pub fn parse(input: &str) -> Result<ProgramRoot, ANTLRError> {
        let codepoints = input.chars().map(|x| x as u32).collect::<Vec<_>>();
        let input = InputStream::new(&*codepoints);
        let lexer = ValkyrieAntlrLexer::new(input);
        let token_source = CommonTokenStream::new(lexer);
        let mut parser = ValkyrieAntlrParser::new(token_source);
        let root = parser.program()?;
        let mut state = ValkyrieProgramParser::default();
        state.visit(&*root);
        Ok(ProgramRoot { statements: state.statements })
    }
}