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
// Copyright (c) 2019 Georg Brandl.  Licensed under the Apache License,
// Version 2.0 <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0>
// or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>, at
// your option. This file may not be copied, modified, or distributed except
// according to those terms.

//! A G-Code parsing and evaluation library, aiming for compatibility with the
//! [LinuxCNC] dialect of G-Code.
//!
//! Currently, it can parse G-Code into an AST, using the Pest parser library.
//! An evaluator is work in progress and the current state can be enabled with
//! the *eval* feature flag.
//!
//! [LinuxCNC]: http://linuxcnc.org/docs/html/gcode/overview.html
//!
//! ## Basic usage
//!
//! Use `ngc::parse::parse` to get an AST, then work with the abstract syntax
//! tree datastructures from `ngc::ast`.
//!
//! Later, you will be able to feed this into an evaluator from `ngc::eval`,
//! which takes care of evaluating expressions, checking invalid codes and
//! combinations, and yielding a series of more machine-level instructions.
//!
//! The following code (the same as the "ngc-parse" demo binary) takes a file as
//! an argument, parses it and outputs the display form, which is the same
//! G-code, but in a consistent format and cleaned of comments.
//!
//! ```rust,no_run
//! use std::{env, fs};
//! use ngc::parse::parse;
//!
//! fn main() {
//!     let filename = env::args().nth(1).unwrap();
//!     let input = fs::read_to_string(&filename).unwrap();
//!
//!     match parse(&filename, &input) {
//!         Err(e) => eprintln!("Parse error: {}", e),
//!         Ok(prog) => println!("{}", prog),
//!     }
//! }
//! ```
//!
//! ## Unsupported features
//!
//! Currently, LinuxCNC's control flow constructs ("O codes") are completely
//! unsupported.


pub mod ast;
pub mod parse;

#[cfg(feature = "eval")]
pub mod eval;

// internal helpers
pub(crate) mod util;