vos_ast/parser/
mod.rs

1use std::{cmp::Ordering, ops::Range, str::FromStr};
2
3use bigdecimal::BigDecimal;
4use peginator::PegParser;
5use vos_error::{VosError, VosResult};
6
7use crate::{
8    ast::{TableKind, TableStatement, VosAST, VosStatement},
9    parser::vos::{
10        ConstraintStatementNode, DeclareBodyNode, FieldStatementNode, GenericNode, GenericNum1, GenericNum1Token, GenericNum2,
11        GenericNum2Token, GenericNum3, IdentifierNode, KeyNode, NamespaceNode, NumNode, TypeValueNode, ValueNode, VosParser,
12        VosStatementNode,
13    },
14    ConstraintStatement, FieldStatement, FieldTyping, GenericStatement, Identifier, Namespace, ValueKind, ValueStatement,
15};
16
17mod field;
18mod number;
19mod symbol;
20mod value;
21mod vos;
22
23struct VosVisitor {
24    ast: VosAST,
25    file: String,
26    errors: Vec<VosError>,
27}
28
29impl FromStr for VosAST {
30    type Err = Vec<VosError>;
31
32    fn from_str(s: &str) -> Result<Self, Self::Err> {
33        parse(s)
34    }
35}
36
37pub fn parse(input: &str) -> Result<VosAST, Vec<VosError>> {
38    let mut parser = VosVisitor { ast: VosAST { statements: vec![] }, file: "".to_string(), errors: vec![] };
39    if let Err(e) = parser.parse(input) {
40        return Err(vec![e]);
41    }
42    match parser.errors.is_empty() {
43        true => Ok(parser.ast),
44        false => Err(parser.errors),
45    }
46}
47
48pub fn as_range(range: &Range<usize>) -> Range<u32> {
49    Range { start: range.start as u32, end: range.end as u32 }
50}
51
52fn as_value(v: &Option<ValueNode>) -> VosResult<ValueStatement> {
53    match v {
54        Some(s) => s.as_value(),
55        None => Ok(ValueStatement::default()),
56    }
57}
58
59impl VosVisitor {
60    pub fn parse(&mut self, input: &str) -> VosResult {
61        for statement in VosParser::parse(input)?.statements {
62            match self.visit_statement(statement) {
63                Ok(_) => {}
64                Err(e) => self.errors.push(e),
65            }
66        }
67        return Ok(());
68    }
69    fn visit_statement(&mut self, node: VosStatementNode) -> VosResult {
70        match node {
71            VosStatementNode::StructDeclareNode(s) => {
72                let mut table = TableStatement::default();
73                table.kind = TableKind::Structure;
74                self.push_table(table, s.id, s.body)?
75            }
76            VosStatementNode::TableDeclareNode(s) => {
77                let mut table = TableStatement::default();
78                table.kind = TableKind::Table;
79                self.push_table(table, s.id, s.body)?
80            }
81            VosStatementNode::ObjectStatementNode(s) => self.ast.push_object(s.id.as_identifier(), s.value.as_value()?),
82            VosStatementNode::UnionStatementNode(_) => {
83                todo!()
84                // s.id.as_identifier()
85                // s.body
86            }
87            VosStatementNode::Split(_) => {}
88        }
89        Ok(())
90    }
91    fn push_table(&mut self, mut table: TableStatement, id: IdentifierNode, body: Vec<DeclareBodyNode>) -> VosResult {
92        table.name = id.as_identifier();
93        for term in body {
94            match term {
95                DeclareBodyNode::FieldStatementNode(v) => match table.add_field(v.as_field()?) {
96                    Ok(_) => {}
97                    Err(e) => {
98                        todo!("重复的 key {}", e.name)
99                    }
100                },
101                DeclareBodyNode::ConstraintStatementNode(v) => table.add_constraint(v.as_constraint()?),
102                DeclareBodyNode::Split(_) => {}
103            }
104        }
105        self.ast.statements.push(VosStatement::Table(Box::new(table)));
106        Ok(())
107    }
108}
109
110impl KeyNode {
111    pub fn as_identifier(&self) -> Identifier {
112        match self {
113            KeyNode::IdentifierNode(v) => v.as_identifier(),
114            KeyNode::NumNode(_) => Identifier::default(),
115        }
116    }
117}