Struct rustemo_compiler::grammar::Grammar
source · pub struct Grammar {
pub imports: Vec<ImportStm>,
pub productions: ProdVec<Production>,
pub terminals: TermVec<Terminal>,
pub nonterminals: NonTermVec<NonTerminal>,
pub nonterm_by_name: BTreeMap<String, SymbolIndex>,
pub term_by_name: BTreeMap<String, SymbolIndex>,
pub empty_index: SymbolIndex,
pub stop_index: SymbolIndex,
pub augmented_index: SymbolIndex,
pub augmented_layout_index: Option<SymbolIndex>,
pub start_index: SymbolIndex,
}
Fields§
§imports: Vec<ImportStm>
§productions: ProdVec<Production>
§terminals: TermVec<Terminal>
§nonterminals: NonTermVec<NonTerminal>
§nonterm_by_name: BTreeMap<String, SymbolIndex>
§term_by_name: BTreeMap<String, SymbolIndex>
§empty_index: SymbolIndex
Index of EMPTY symbol
stop_index: SymbolIndex
Index of STOP symbol
augmented_index: SymbolIndex
Index of grammar augmented symbol
augmented_layout_index: Option<SymbolIndex>
Index of augmented symbol for Layout rule if given
start_index: SymbolIndex
An index of the start symbol. First non-terminal or terminal of the grammar.
Implementations§
source§impl Grammar
impl Grammar
pub fn symbol_index(&self, name: &str) -> SymbolIndex
pub fn symbol_name(&self, index: SymbolIndex) -> String
sourcepub fn symbol_has_content(&self, symbol: SymbolIndex) -> bool
pub fn symbol_has_content(&self, symbol: SymbolIndex) -> bool
If this symbol is either a non-terminal of a terminal with a content. I.e. not a constant match terminal (keyword, punctuation…)
pub fn symbol_indexes(&self, names: &[&str]) -> SymbolVec<SymbolIndex>
pub fn symbol_names<T>(&self, indexes: T) -> Vec<String>where
T: IntoIterator<Item = SymbolIndex>,
pub fn term_to_symbol_index(&self, index: TermIndex) -> SymbolIndex
sourcepub fn symbol_to_term_index(&self, index: SymbolIndex) -> TermIndex
pub fn symbol_to_term_index(&self, index: SymbolIndex) -> TermIndex
Convert symbol index to terminal index.
sourcepub fn symbol_to_term(&self, index: SymbolIndex) -> &Terminal
pub fn symbol_to_term(&self, index: SymbolIndex) -> &Terminal
Convert symbol index to terminal
sourcepub fn term_by_name(&self, name: &str) -> &Terminal
pub fn term_by_name(&self, name: &str) -> &Terminal
Get Terminal by name.
sourcepub fn term_by_index(&self, index: TermIndex) -> &Terminal
pub fn term_by_index(&self, index: TermIndex) -> &Terminal
Get Terminal by index.
pub fn nonterm_to_symbol_index(&self, index: NonTermIndex) -> SymbolIndex
sourcepub fn symbol_to_nonterm_index(&self, index: SymbolIndex) -> NonTermIndex
pub fn symbol_to_nonterm_index(&self, index: SymbolIndex) -> NonTermIndex
Convert symbol index to non-terminal index. Panics if symbol index is a terminal index.
sourcepub fn symbol_to_nonterm(&self, index: SymbolIndex) -> &NonTerminal
pub fn symbol_to_nonterm(&self, index: SymbolIndex) -> &NonTerminal
Convert symbol index to non-terminal. Panics if symbol index is a terminal index.
sourcepub fn nonterm_by_name(&self, name: &str) -> &NonTerminal
pub fn nonterm_by_name(&self, name: &str) -> &NonTerminal
Get NonTerminal by name.
sourcepub fn nonterm_by_index(&self, index: NonTermIndex) -> &NonTerminal
pub fn nonterm_by_index(&self, index: NonTermIndex) -> &NonTerminal
Get NonTerminal by index.
sourcepub fn is_nonterm(&self, index: SymbolIndex) -> bool
pub fn is_nonterm(&self, index: SymbolIndex) -> bool
Convert symbol index to non-terminal. Panics if symbol index is a terminal index.
pub fn is_term(&self, index: SymbolIndex) -> bool
pub fn is_empty(&self, index: SymbolIndex) -> bool
pub fn production_len(&self, prod: ProdIndex) -> usize
pub fn production_rhs_symbols(&self, prod: ProdIndex) -> Vec<SymbolIndex>
sourcepub fn productions(&self) -> Vec<&Production>
pub fn productions(&self) -> Vec<&Production>
Returns all productions except special AUG and AUGL.
sourcepub fn nonterminals(&self) -> Vec<&NonTerminal>
pub fn nonterminals(&self) -> Vec<&NonTerminal>
Returns all nonterminals except special EMPTY, AUG and AUGL.