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 }
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}