@@ -2,7 +2,7 @@ use log::debug;
22use pest:: { self , error:: Error , Parser } ;
33use std:: collections:: HashMap ;
44
5- use crate :: script:: ast:: { Arg , Dist , Instruction , Node } ;
5+ use crate :: script:: ast:: { Arg , Dist , Instruction , MachineInstruction , Node } ;
66
77// ANCHOR: parser
88#[ derive( pest_derive:: Parser ) ]
@@ -18,9 +18,17 @@ pub fn parse_instructions(source: &str) -> Result<Vec<Node>, Error<Rule>> {
1818 pest:: set_error_detail ( true ) ;
1919 let mut ast = vec ! [ ] ;
2020 let pairs = InstructionParser :: parse ( Rule :: file, source) ?;
21+ let expr_rules = [ Rule :: expr, Rule :: machine] ;
22+
2123 for pair in pairs {
22- if let Rule :: file = pair. as_rule ( ) {
23- ast. push ( build_ast_from_expr ( pair. into_inner ( ) . next ( ) . unwrap ( ) ) ) ;
24+ if pair. as_rule ( ) != Rule :: file {
25+ continue ;
26+ }
27+
28+ for i in pair. into_inner ( ) {
29+ if expr_rules. contains ( & i. as_rule ( ) ) {
30+ ast. push ( build_ast_from_expr ( i) ) ;
31+ }
2432 }
2533 }
2634 debug ! ( "AST {:?}" , ast) ;
@@ -30,6 +38,9 @@ pub fn parse_instructions(source: &str) -> Result<Vec<Node>, Error<Rule>> {
3038fn build_ast_from_expr ( pair : pest:: iterators:: Pair < Rule > ) -> Node {
3139 match pair. as_rule ( ) {
3240 Rule :: expr => build_ast_from_expr ( pair. into_inner ( ) . next ( ) . unwrap ( ) ) ,
41+ Rule :: machine => Node :: Machine {
42+ m_instructions : build_ast_from_minstr ( pair. into_inner ( ) ) ,
43+ } ,
3344 Rule :: function => {
3445 let mut inner = pair. into_inner ( ) ;
3546 let mut work = inner. next ( ) . unwrap ( ) . into_inner ( ) ;
@@ -65,6 +76,49 @@ fn build_ast_from_expr(pair: pest::iterators::Pair<Rule>) -> Node {
6576 }
6677}
6778
79+ fn build_ast_from_minstr (
80+ pair : pest:: iterators:: Pairs < Rule > ,
81+ ) -> Vec < MachineInstruction > {
82+ let mut instr = vec ! [ ] as Vec < MachineInstruction > ;
83+
84+ for i in pair {
85+ let mut inner = i. into_inner ( ) ;
86+ let name = inner. next ( ) . unwrap ( ) ;
87+ match name. into_inner ( ) . next ( ) . unwrap ( ) . as_rule ( ) {
88+ Rule :: server => {
89+ let port: u16 = inner
90+ . next ( )
91+ . unwrap ( )
92+ . into_inner ( )
93+ . next ( )
94+ . unwrap ( )
95+ . as_span ( )
96+ . as_str ( )
97+ . to_string ( )
98+ . parse ( )
99+ . unwrap ( ) ;
100+ instr. push ( MachineInstruction :: Server { port } ) ;
101+ }
102+ unknown => panic ! ( "Unknown machine instruction: {unknown:?}" ) ,
103+ }
104+
105+ //debug!("PAIR {:?}", inner.next().unwrap().as_span());
106+ //debug!("PAIR {:?}", inner.next().unwrap().into_inner().next().unwrap().as_span());
107+ //match i.as_rule() {
108+ //Rule::mInstrName => {
109+ //debug!("INSTR {:?}", i.into_inner());
110+ ////let mut instrs = i.into_inner().next().unwrap().into_inner();
111+ ////let name = instrs.next().unwrap().as_span().as_str().to_string();
112+
113+ //instr.push(MachineInstruction::Server { port: 80 });
114+ //}
115+ //unknown => panic!("Unknown machine instruction: {unknown:?}"),
116+ //}
117+ }
118+
119+ instr
120+ }
121+
68122fn build_ast_from_instr ( pair : pest:: iterators:: Pair < Rule > ) -> Vec < Instruction > {
69123 let mut instr = vec ! [ ] as Vec < Instruction > ;
70124
0 commit comments