1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
use cfg::Symbol;
use enum_coder::enum_coder;

use output::translator::IrTranslator;

#[derive(Debug, Eq, PartialEq)]
pub struct InstructionList {
    pub list: Vec<Instruction>,
}

enum_coder! {
    #[derive(Debug, Eq, PartialEq)]
    pub enum Instruction {
        // Concat(usize),
        // ConcatSeparated(usize, rs::TokenStream),
        // Dup,

        MakeTerminalAccessorFn {
            terminal: Symbol,
        },

        MakeTerminalAccessorStruct {
            number: usize,
        },

        // // defines:
        // //
        // // impl EnumStreamParser<C, D> {
        // //     fn common_parse<Iter>(&'g mut self, into_iter: Iter, traced: bool) 
        // // }
        // MakeEnumStreamParserCommonParseImpl {
        //     UpperParse: rs::Ident,
        //     UpperInferTree: rs::Ident,
        // },

        // MakeValueConditionally {
        //     UpperValue: rs::Ident,
        //     terminal_id: usize,
        //     variant: rs::Ident,
        // },

        // MakeNegativePatternMatchArm {
        //     pattern: rs::Pat,
        // },

        // MakePositiveMatch {
        //     patterns: Vec<rs::Pat>,
        //     guard: Option<rs::Expr>,
        // },

        // MakeTerminalAction {
        //     terminal_id: usize,
        // },

        // MakeLayerMacroDefinition {
        //     layer_macro: rs::Ident,
        //     UpperTerminalAccessor: rs::Ident,
        // },
    }

    // #[missing_field(ir)]
    // fn make_ident(ir: &Ir, field_name: &str) -> rs::Ident {
    //     let upper_id = ir.level - 1;
    //     rs::str_to_ident(format!("{}{}", field_name, upper_id))
    // }
    // #[missing_field(ir)]
    // fn make_ident(ir: &Ir, field_name: &str) -> rs::Ident {
    //     let id = if field_name.starts_with("Lower") || field_name.starts_with("lower") {
    //         current_id + 1
    //     } else if field_name.starts_with("Upper") {
    //         if current_id == 0 { !0 } else { current_id - 1 }
    //     } else {
    //         current_id
    //     };
    //     rs::Ident::new(&*format!("{}{}", field_name, id), rs::Span::call_site())
    // }

    #[generate_list]
    pub fn translate_ir(translator: &mut IrTranslator) -> Vec<Instruction> {
        // MakeCommonDefinitions();
        for &terminal in &translator.terminals {
            MakeTerminalAccessorFn {
                terminal,
            }
        }
        MakeTerminalAccessorStruct {
            number: translator.terminals.len(),
        }

        // ConcatSeparated(ir.rules.len(), quote! { , });
        // Dup();
        // MakeEnumStreamParserCommonParseImpl();
        // for (n, rule) in ir.rules.iter().enumerate() {
        //     let capitalized = capitalize(&rule.name.to_string()[..]);
        //     let variant = rs::str_to_ident(&capitalized[..]);
        //     MakeValueConditionally {
        //         terminal_id: n,
        //         variant,
        //     };
        // }
        // Concat(ir.rules.len());
        // for (n, rule) in ir.rules.iter().enumerate() {
        //     for negative_pattern in &rule.negative {
        //         MakeNegativePatternMatchArm {
        //             pattern: negative_pattern.clone()
        //         }
        //     }
        //     Concat(rule.negative.len());
        //     MakePositiveMatch {
        //         patterns: rule.positive.clone(),
        //         guard: rule.guard.clone(),
        //     };
        //     MakeTerminalAction { terminal_id: n }
        // }
        // Concat(ir.rules.len());
        // MakeLayerMacroDefinition();
    }
}