Skip to content

Latest commit

 

History

History
75 lines (55 loc) · 1.26 KB

default_names_for_grammar_rules.md

File metadata and controls

75 lines (55 loc) · 1.26 KB

Default Names For Grammar Rules

Each grammar rule is converted to an enum. For example:

S: T | B;
T: A;

terminals

A: 'a';
B: 'b';

For grammar symbol S and T, we have their corresponding enums in the action file.

pub enum S {
    T(T),
    B,
}

pub enum T {
    A,
}

Each production appears as a variant in enum. For grammar rule starting with S, which has two productions T and B, we can see that the corresponding variants of enum S are S::T(T) and S::B.

If a production is too complicated (say, containing many grammar symbols), rcomp will create a new struct for it. For example:

S: X Y | Y Z;
X: A A;
Y: B B;
Z: A B;

terminals

A: 'a';
B: 'b';

Productions X Y and Y Z are converted to structs SC1 and SC2.

pub enum S {
    C1(SC1),
    C2(SC2),
}

pub struct SC1 {
    pub x: X,
    pub y: Y,
}

pub struct SC2 {
    pub y: Y,
    pub z: Z,
}

Each production also has an fn with name <grammar_symbol>_<variant_name>.

pub fn s_c1(_ctx: &Ctx, x: X, y: Y) -> S { /* ... */ }
pub fn s_c2(_ctx: &Ctx, y: Y, z: Z) -> S { /* ... */ }

➡️ Next: Default Actions For Terminals

📘 Back: Table of contents