pub struct YaccGrammar<StorageT = u32> { /* private fields */ }
Expand description
Representation of a YaccGrammar
. See the top-level documentation for the
guarantees this struct makes about rules, tokens, productions, and symbols.
Implementations§
source§impl YaccGrammar<u32>
impl YaccGrammar<u32>
pub fn new(yacc_kind: YaccKind, s: &str) -> YaccGrammarResult<Self>
source§impl<StorageT: 'static + PrimInt + Unsigned> YaccGrammar<StorageT>where
usize: AsPrimitive<StorageT>,
impl<StorageT: 'static + PrimInt + Unsigned> YaccGrammar<StorageT>where
usize: AsPrimitive<StorageT>,
sourcepub fn new_with_storaget(
yacc_kind: YaccKind,
s: &str,
) -> YaccGrammarResult<Self>
pub fn new_with_storaget( yacc_kind: YaccKind, s: &str, ) -> YaccGrammarResult<Self>
Takes as input a Yacc grammar of YaccKind
as a String
s
and returns a
YaccGrammar
(or
(YaccGrammarError
on error).
As we’re compiling the YaccGrammar
, we add a new start rule (which we’ll refer to as ^
,
though the actual name is a fresh name that is guaranteed to be unique) that references the
user defined start rule.
pub fn new_from_ast_with_validity_info( yacc_kind: YaccKind, ast_validation: &ASTWithValidityInfo, ) -> YaccGrammarResult<Self>
sourcepub fn iter_pidxs(&self) -> impl Iterator<Item = PIdx<StorageT>>
pub fn iter_pidxs(&self) -> impl Iterator<Item = PIdx<StorageT>>
Return an iterator which produces (in order from 0..self.prods_len()
) all this
grammar’s valid PIdx
s.
sourcepub fn prod(&self, pidx: PIdx<StorageT>) -> &[Symbol<StorageT>]
pub fn prod(&self, pidx: PIdx<StorageT>) -> &[Symbol<StorageT>]
Get the sequence of symbols for production pidx
. Panics if pidx
doesn’t exist.
sourcepub fn prod_len(&self, pidx: PIdx<StorageT>) -> SIdx<StorageT>
pub fn prod_len(&self, pidx: PIdx<StorageT>) -> SIdx<StorageT>
How many symbols does production pidx
have? Panics if pidx
doesn’t exist.
sourcepub fn prod_to_rule(&self, pidx: PIdx<StorageT>) -> RIdx<StorageT>
pub fn prod_to_rule(&self, pidx: PIdx<StorageT>) -> RIdx<StorageT>
Return the rule index of the production pidx
. Panics if pidx
doesn’t exist.
sourcepub fn prod_precedence(&self, pidx: PIdx<StorageT>) -> Option<Precedence>
pub fn prod_precedence(&self, pidx: PIdx<StorageT>) -> Option<Precedence>
Return the precedence of production pidx
(where None
indicates “no precedence specified”).
Panics if pidx
doesn’t exist.
sourcepub fn start_prod(&self) -> PIdx<StorageT>
pub fn start_prod(&self) -> PIdx<StorageT>
Return the production index of the start rule’s sole production (for Yacc grammars the start rule is defined to have precisely one production).
sourcepub fn iter_rules(&self) -> impl Iterator<Item = RIdx<StorageT>>
pub fn iter_rules(&self) -> impl Iterator<Item = RIdx<StorageT>>
Return an iterator which produces (in order from 0..self.rules_len()
) all this
grammar’s valid RIdx
s.
sourcepub fn rule_to_prods(&self, ridx: RIdx<StorageT>) -> &[PIdx<StorageT>]
pub fn rule_to_prods(&self, ridx: RIdx<StorageT>) -> &[PIdx<StorageT>]
Return the productions for rule ridx
. Panics if ridx
doesn’t exist.
sourcepub fn rule_name(&self, ridx: RIdx<StorageT>) -> &str
👎Deprecated since 0.13.0: Please use rule_name_str instead
pub fn rule_name(&self, ridx: RIdx<StorageT>) -> &str
Return the name of rule ridx
. Panics if ridx
doesn’t exist.
sourcepub fn rule_name_str(&self, ridx: RIdx<StorageT>) -> &str
pub fn rule_name_str(&self, ridx: RIdx<StorageT>) -> &str
Return the name of rule ridx
. Panics if ridx
doesn’t exist.
sourcepub fn rule_name_span(&self, ridx: RIdx<StorageT>) -> Span
pub fn rule_name_span(&self, ridx: RIdx<StorageT>) -> Span
Return the span of rule ridx
. Panics if ridx
doesn’t exist.
sourcepub fn implicit_rule(&self) -> Option<RIdx<StorageT>>
pub fn implicit_rule(&self) -> Option<RIdx<StorageT>>
Return the RIdx
of the implict rule if it exists, or None
otherwise.
sourcepub fn rule_idx(&self, n: &str) -> Option<RIdx<StorageT>>
pub fn rule_idx(&self, n: &str) -> Option<RIdx<StorageT>>
Return the index of the rule named n
or None
if it doesn’t exist.
sourcepub fn start_rule_idx(&self) -> RIdx<StorageT>
pub fn start_rule_idx(&self) -> RIdx<StorageT>
What is the index of the start rule? Note that cfgrammar will have inserted at least one rule “above” the user’s start rule.
sourcepub fn tokens_len(&self) -> TIdx<StorageT>
pub fn tokens_len(&self) -> TIdx<StorageT>
How many tokens does this grammar have?
sourcepub fn iter_tidxs(&self) -> impl Iterator<Item = TIdx<StorageT>>
pub fn iter_tidxs(&self) -> impl Iterator<Item = TIdx<StorageT>>
Return an iterator which produces (in order from 0..self.tokens_len()
) all this
grammar’s valid TIdx
s.
sourcepub fn eof_token_idx(&self) -> TIdx<StorageT>
pub fn eof_token_idx(&self) -> TIdx<StorageT>
Return the index of the end token.
sourcepub fn token_name(&self, tidx: TIdx<StorageT>) -> Option<&str>
pub fn token_name(&self, tidx: TIdx<StorageT>) -> Option<&str>
Return the name of token tidx
(where None
indicates “the rule has no name”). Panics if
tidx
doesn’t exist.
sourcepub fn token_precedence(&self, tidx: TIdx<StorageT>) -> Option<Precedence>
pub fn token_precedence(&self, tidx: TIdx<StorageT>) -> Option<Precedence>
Return the precedence of token tidx
(where None
indicates “no precedence specified”).
Panics if tidx
doesn’t exist.
sourcepub fn token_epp(&self, tidx: TIdx<StorageT>) -> Option<&str>
pub fn token_epp(&self, tidx: TIdx<StorageT>) -> Option<&str>
Return the %epp entry for token tidx
(where None
indicates “the token has no
pretty-printed value”). Panics if tidx
doesn’t exist.
sourcepub fn token_span(&self, tidx: TIdx<StorageT>) -> Option<Span>
pub fn token_span(&self, tidx: TIdx<StorageT>) -> Option<Span>
Return the span for token given by tidx
if one exists.
If None
, the token is either implicit and not derived from a token
in the source, otherwise the YaccGrammar
itself may not derived from a
textual source in which case the token may be explicit but still lack spans
from its construction.
sourcepub fn action(&self, pidx: PIdx<StorageT>) -> &Option<String>
pub fn action(&self, pidx: PIdx<StorageT>) -> &Option<String>
Get the action for production pidx
. Panics if pidx
doesn’t exist.
pub fn actiontype(&self, ridx: RIdx<StorageT>) -> &Option<String>
pub fn parse_param(&self) -> &Option<(String, String)>
sourcepub fn tokens_map(&self) -> HashMap<&str, TIdx<StorageT>>
pub fn tokens_map(&self) -> HashMap<&str, TIdx<StorageT>>
Returns a map from names to TIdx
s of all tokens that a lexer will need to generate valid
inputs from this grammar.
sourcepub fn token_idx(&self, n: &str) -> Option<TIdx<StorageT>>
pub fn token_idx(&self, n: &str) -> Option<TIdx<StorageT>>
Return the index of the token named n
or None
if it doesn’t exist.
sourcepub fn avoid_insert(&self, tidx: TIdx<StorageT>) -> bool
pub fn avoid_insert(&self, tidx: TIdx<StorageT>) -> bool
Is the token tidx
marked as %avoid_insert
?
pub fn expect(&self) -> Option<usize>
pub fn expectrr(&self) -> Option<usize>
sourcepub fn has_path(&self, from: RIdx<StorageT>, to: RIdx<StorageT>) -> bool
pub fn has_path(&self, from: RIdx<StorageT>, to: RIdx<StorageT>) -> bool
Is there a path from the from
rule to the to
rule? Note that recursive rules
return true
for a path from themselves to themselves.
sourcepub fn pp_prod(&self, pidx: PIdx<StorageT>) -> String
pub fn pp_prod(&self, pidx: PIdx<StorageT>) -> String
Returns the string representation of a given production pidx
.
sourcepub fn sentence_generator<F>(
&self,
token_cost: F,
) -> SentenceGenerator<'_, StorageT>
pub fn sentence_generator<F>( &self, token_cost: F, ) -> SentenceGenerator<'_, StorageT>
Return a SentenceGenerator
which can then generate minimal sentences for any rule
based on the user-defined token_cost
function which gives the associated cost for
generating each token (where the cost must be greater than 0). Note that multiple
tokens can have the same score. The simplest cost function is thus |_| 1
.
sourcepub fn firsts(&self) -> YaccFirsts<StorageT>
pub fn firsts(&self) -> YaccFirsts<StorageT>
Return a YaccFirsts
struct for this grammar.
sourcepub fn follows(&self) -> YaccFollows<StorageT>
pub fn follows(&self) -> YaccFollows<StorageT>
Return a YaccFirsts
struct for this grammar.