# Quick guide for write grammars Hi! You want to write a grammar quickly Let's begin # Rules The rules are the way to define a sentence ```rust // name = {"something"} organization = {"IETF means Internet Engineering Task Force"} ``` A rule can refer to more rules ```rust browser = {"Firefox"} fact = {browser ~ " has a good performance."} // prints: "Firefox has a good performance." ``` # Ordered choices You can have multiple options with "|" ```rust browser = {"Firefox" | "Chrome" | "Safari"} fact = {browser ~ " has a good support."} // "Firefox has a good support." // "Chrome has a good support." // "Safari has a good support." ``` # Options You can generate something or not... with "?" ```rust evasion = "don't" sentence = {"I " ~ evasion? ~ " like to clean my room."} // {"I like to clean my room."} // {"I don't like to clean my room."} ``` # Repetitions You can repeat a rule n times with `{n}` ```rust uncontrollable = {" great"} fact = {"I have a" ~ uncontrollable{3} ~ " desire to eat hamburger."} // "I have a great great great desire to eat hamburger." ``` You can repeat a rule in a range with `{n,m}` [inclusive, inclusive] ```rust uncontrollable = {" great"} fact = {"I have a" ~ uncontrollable{2,4} ~ " desire to eat hamburger."} // "I have a great great desire to eat hamburger." // "I have a great great great desire to eat hamburger." // "I have a great great great great desire to eat hamburger." ``` You can repeat a rule at most n times with `{,n}`, it's like {0, n} ```rust uncontrollable = {" great"} fact = {"I have a" ~ uncontrollable{,3} ~ " desire to eat hamburger."} // "I have a desire to eat hamburger." // "I have a great desire to eat hamburger." // "I have a great great to eat hamburger." // "I have a great great great desire to eat hamburger." ``` You can repeat a rule at least n times with `{n,}`, it's like {n, infinity} (Not really, but there are an option to control the upper limit) ```rust uncontrollable = {" great"} fact = {"I have a" ~ uncontrollable{,3} ~ " desire to eat hamburger."} // "I have a desire to eat hamburger." // "I have a great desire to eat hamburger." // "I have a great great to eat hamburger." // "I have a great great great desire to eat hamburger." ``` You can repeat a rule zero or more times with `*`, it's like {0, infinity} (Not really, but there are an option to control the upper limit) ```rust uncontrollable = {" great"} fact = {"I have a" ~ uncontrollable* ~ " desire to eat hamburger."} // "I have a desire to eat hamburger." // "I have a great desire to eat hamburger." // ... // "I have a great great great great desire to eat hamburger." ``` You can repeat a rule one or more times with `*`, it's like {1, infinity} (Not really, but there are an option to control the upper limit) ```rust uncontrollable = {" great"} fact = {"I have a" ~ uncontrollable+ ~ " desire to eat hamburger."} // "I have a great desire to eat hamburger." // ... // "I have a great great great great desire to eat hamburger." ``` # Grouping You can group things with parentheses "(" and ")" ```rust // aerobics will have a probability of 0.25 to be generated. // archery will have a probability of 0.25 to be generated. // cycling will have a probability of 0.5 to be generated. sport = {("aerobics" | "archery") | "cycling"} sentence = {"I like to do " ~ sport ~ " in the mornings."} ``` # The negation predicate You can avoid the generation of an element with this pattern ```rust // Or letter = {ASCII_ALPHA_LOWER} letter = { "a" | "b" | "c" | "d" | "e" | "f" | "g" } vocal = { "a" | "e" | "i" | "o" | "u"} consonant = {!vocal ~ letter} ``` The only constraint to use this is that the exclamation point must be accompanied by a rule ```rust // This is valid, but doesn't work consonant = {!("a" | "e" | "i" | "o" | "u") ~ letter} ``` # Char ranges You can define a range of characters like this: ```rust letter = { 'a'..'z' } other = {'b'..'m'} hex = {'A'..'F'} ``` # Built-in rules There are rules available for simplify the grammar **Note:** Currently only the ascii rules from pest reference are supported. | Rule | Equivalent | | ------------------- | ----------------------------------------------- | | ANY | `('\u{00}'..'\u{10FFFF}')` | | ASCII_DIGIT | `('0'..'9')` | | ASCII_NONZERO_DIGIT | `('1'..'9')` | | ASCII_BIN_DIGIT | `('0'..'1')` | | ASCII_OCT_DIGIT | `('0'..'7')` | | ASCII_HEX_DIGIT | `('0'..'9' | 'a'..'f' | 'A'..'F')` | | ASCII_ALPHA_LOWER | `('a'..'z')` | | ASCII_ALPHA_UPPER | `('A'..'Z')` | | ASCII_ALPHANUMERIC | `('0'..'9' 'a'..'z' \| 'A'..'Z')` | | NEWLINE | `("\n" | "\r\n" | "\r")` | ```rust number = {ASCII_DIGIT} // Some day myWage = ASCII_NONZERO_DIGIT{5,10} secretMessage = ASCII_ALPHANUMERIC+ ```