backyard-nodes 0.1.9

Nodes representing PHP code AST.
Documentation
# backyard-nodes

Nodes representing PHP code AST, with simple builder and walker.

## features

- Ast Nodes
- _"builder"_ simplify building AST nodes
- _"walker"_ simple walker through AST nodes

## usage

### builder

This builder is behind the `builder` feature.

    use backyard_nodes::builder::{ Builder, BlueprintBuildable };
    fn main() {
      let arena = bumpalo::Bump::new();
      let b = Builder::new();
      let node = b
        .Program(&[b.Assignment(b.Variable(b.Identifier("a")), "=", b.Number("21"))])
        .build(&arena);
      println!("{node:?}");
    }

Resulting this:

    Node {
      node_type: Program,
      wrapper: Program(ProgramNode {
        children: [
          Node {
            node_type: Assignment,
            wrapper: Assignment(AssignmentNode {
              left: Node {
                node_type: Variable,
                wrapper: Variable(VariableNode {
                  name: Node {
                    node_type: Identifier,
                    wrapper: Identifier(IdentifierNode { name: "a" }),
                    loc: None, leadings: None, trailings: None
                  }
                }),
                loc: None, leadings: None, trailings: None
              },
              operator: "=",
              right: Node {
                node_type: Number,
                wrapper: Number(NumberNode { value: "21" }),
                loc: None, leadings: None, trailings: None
              }
            }),
            loc: None, leadings: None, trailings: None
          }]
        }),
      loc: None, leadings: None, trailings: None
    }

### walker

This builder is behind the `walker` feature.

    use backyard_nodes::{ builder::{ BlueprintBuildable, Builder }, walker::Walker, NodeType };

    fn main() {
      let arena = bumpalo::Bump::new();
      let b = Builder::new();
      let node = b
        .Program(&[b.Assignment(b.Variable(b.Identifier("a")), "=", b.Number("21"))])
        .build(&arena);
      let mut walker = Walker::new(&*node).into_iter();

      assert_eq!(NodeType::Program, walker.next().unwrap().node_type);
      assert_eq!(NodeType::Assignment, walker.next().unwrap().node_type);
      assert_eq!(NodeType::Variable, walker.next().unwrap().node_type);
      assert_eq!(NodeType::Identifier, walker.next().unwrap().node_type);
      assert_eq!(NodeType::Number, walker.next().unwrap().node_type);
      assert!(walker.next().is_none());
    }

## ecosystem

- [backyard-lexer (Tokenizer)]https://crates.io/crates/backyard-lexer
- [backyard-parser]https://crates.io/crates/backyard-parser
- [backyard-generator]https://crates.io/crates/backyard-generator

## heavily inspired by

- [oxc-project/oxc]https://github.com/oxc-project/oxc
- [nikic/PHP-Parser]https://github.com/nikic/PHP-Parser
- [glayzzle/php-parser]https://github.com/glayzzle/php-parser

## license

[MIT](https://github.com/Alzera/backyard/blob/main/LICENSE)