Struct LemonMintBuilder

Source
pub struct LemonMintBuilder { /* private fields */ }
Expand description

Builder class that will finally generate LemonMint. Call builder methods to supply parser rules and options - everything that you would normally put to Lemon’s Y-grammar file. Or you can feed the Y-file itself (it’s syntax is similar to Lemon’s one).

§Example

use lemon_mint::LemonMintBuilder;
use std::sync::Arc;

let fake_filename = Arc::new("source.y".to_string()); // will appear in error messages
let builder = LemonMintBuilder::new().load_y(&fake_filename, "%token_type {f64}\nUnit ::= NEW_LINE.".as_bytes()).unwrap();
let lemon = builder.try_into_lemon().unwrap();

Or:

use lemon_mint::LemonMintBuilder;
use std::sync::Arc;

let fake_filename = Arc::new("source.y".to_string()); // will appear in error messages
let builder = LemonMintBuilder::new()
	.set_token_type("f64".to_string()).unwrap()
	.add_rule(&fake_filename, 1, "Unit".to_string(), "NEW_LINE", "".to_string()).unwrap();
let lemon = builder.try_into_lemon().unwrap();

Implementations§

Source§

impl LemonMintBuilder

Source

pub fn new() -> Self

Creates new builder

Source

pub fn load_y_file(self, filename: &Arc<String>) -> Result<Self, LemonMintError>

Load a Y-grammar file. You can call this function several times to load grammar by parts, and you can call other builder methods to add/override settings.

Source

pub fn load_y<R>( self, filename: &Arc<String>, input: R, ) -> Result<Self, LemonMintError>
where R: Read,

Like load_y_file(), but you give file contents as io::Read object.

§Example
use lemon_mint::LemonMintBuilder;
use std::sync::Arc;

let fake_filename = Arc::new("source.y".to_string()); // will appear in error messages
let builder = LemonMintBuilder::new().load_y(&fake_filename, "%token_type {f64}\nUnit ::= NEW_LINE.".as_bytes()).unwrap();
Source

pub fn set_start_symbol( self, filename: &Arc<String>, n_line: usize, value: String, ) -> Result<Self, LemonMintError>

Set the parser “%start_symbol”.

Source

pub fn set_token_type(self, value: String) -> Result<Self, LemonMintError>

Set the parser “%token_type”.

Source

pub fn set_default_type(self, value: String) -> Result<Self, LemonMintError>

Set the parser “%default_type”.

Source

pub fn set_trace_prompt(self, value: String) -> Result<Self, LemonMintError>

Enable trace, and set prompt that will be printed before each message. The prompt can be empty string.

Source

pub fn set_extra_argument_type( self, value: String, ) -> Result<Self, LemonMintError>

Set the parser %extra_argument. Only it’s type, like:


let builder = LemonMintBuilder::new().set_extra_argument_type("String".to_string()).unwrap();

In your rust code that uses the generated parser, you initialize the extra argument when you create a Parser object:

%code {
	fn main()
	{	let mut parser = Parser::new("Initial value".to_string()); // Initial value of the extra argument
		assert_eq!(parser.extra, "Initial value".to_string());
	}
}

In actions code, the extra argument is available as variable &mut extra:

%token_type {String}
Unit ::= NEW_LINE(tok). extra.push_str(&tok);
Source

pub fn set_left( self, filename: &Arc<String>, n_line: usize, symbol_names: &str, ) -> Result<Self, LemonMintError>

Add the parser “%left A B C”.

§Example

let fake_filename = Arc::new("source.y".to_string()); // will appear in error messages
let builder = LemonMintBuilder::new().set_left(&fake_filename, 1, "PLUS MINUS").unwrap().set_left(&fake_filename, 2, "TIMES DIVIDE").unwrap();
  • symbol_names - Terminal symbol names, separated by whitespace characters. All the symbols will have the same precedence. Further calls to set_left(), set_right() or set_nonassoc() will set higher precedence.
Source

pub fn set_right( self, filename: &Arc<String>, n_line: usize, symbol_names: &str, ) -> Result<Self, LemonMintError>

Add the parser “%right A B C”.

Source

pub fn set_nonassoc( self, filename: &Arc<String>, n_line: usize, symbol_names: &str, ) -> Result<Self, LemonMintError>

Add the parser “%nonassoc A B C”.

Source

pub fn add_type( self, filename: &Arc<String>, n_line: usize, symbol_name: String, type_name: String, ) -> Result<Self, LemonMintError>

Add the parser “%type symbol_name {Type}”.

Source

pub fn get_type(&self, symbol_name: &str) -> Option<(Arc<String>, usize)>

Return Some((filename, n_line)) if given symbol was added through add_type().

Source

pub fn add_fallback( self, filename: &Arc<String>, n_line: usize, fallback_to_symbol_name: String, symbol_names: &str, ) -> Result<Self, LemonMintError>

Add the parser “%fallback FB A B C”.

Source

pub fn add_rule( self, filename: &Arc<String>, n_line: usize, lhs_name: String, rhs_names_aliases: &str, code: String, ) -> Result<Self, LemonMintError>

Add parser rule like “a”, “b(v_b) COMMA c(v_c)”, “vec![v_b, v_c]”

Source

pub fn add_code(self, code: String) -> Result<Self, LemonMintError>

Add the parser %code or %include

Source

pub fn set_no_compress( self, new_no_compress: bool, ) -> Result<Self, LemonMintError>

Allows to disable finite-state machine tables compression. Don’t do this.

Source

pub fn set_no_resort(self, new_no_resort: bool) -> Result<Self, LemonMintError>

Disable resorting states. You don’t need this functionality.

Source

pub fn try_into_lemon(self) -> Result<LemonMint, LemonMintError>

When you feed all the parser rules and options, call this method to finally build the parser finite-state machine transition tables. If there are problems with your grammar or if there are parser conflicts, this will return Err. If parser build succeeds this returns the parser representation as LemonMint object.

Trait Implementations§

Source§

impl Debug for LemonMintBuilder

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl TryFrom<LemonMintBuilder> for LemonMint

Source§

type Error = LemonMintError

The type returned in the event of a conversion error.
Source§

fn try_from(builder: LemonMintBuilder) -> Result<Self, LemonMintError>

Performs the conversion.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.