// This is a Pyramid Grammar which describes its own syntax default relation >= ExprGrammar -> ws {Decl= ws} terminal(aux, #) ws sp nested ws syntax comment ws -> (\s / \n / comment)* sp -> \s* comment -> "//" ~\n* comment -> "/*" (!"*/" .)* "*/" aux Decl Decl -> @§NonterminalDecl= Decl -> @§TerminalDecl= Decl -> @§NestedDecl= Decl -> @§AtomicDecl= Decl -> @§AuxDecl= Decl -> @§SyntaxDecl= Decl -> @§RuleDecl= Decl -> @§PriorityDecl= Decl -> @§DefaultDecl= Decl -> @§ExpressionDecl= Decl -> @§TreatAsDecl= NonterminalDecl -> keyword:"nonterminal" SymbolDecl> TerminalDecl -> keyword:"terminal" SymbolDecl> NestedDecl -> nested SymbolList> AtomicDecl -> atomic SymbolList> AuxDecl -> aux SymbolList> SyntaxDecl -> syntax SymbolList> aux SymbolDecl SymbolDecl -> Modifiers SymbolList Modifiers -> [sp "(" ws [Modifier {ws "," ws Modifier} ws] ")"] ws Modifier -> aux | atomic | nested | syntax | Relation aux -> "aux" | "auxiliary" atomic -> "atomic" nested -> "nested" syntax -> "syntax" Relation -> greaterOrEqual | greater | equal | unrelated greaterOrEqual -> ">=" | "≥" greater -> ">" equal -> "=" unrelated -> "#" SymbolList -> ws [symbol {ws symbol}] symbol -> letter {letter | digit} aux letter digit hexdigit letter -> "a" ... "z" | "A" ... "Z" digit -> "0" ... "9" hexdigit -> digit | "a" ... "f" | "A" ... "F" nested accentedSymbol accentedSymbol -> "`" symbol RuleDecl -> symbol sp arrow> ws Expr> syntax arrow arrow -> "->" | "-->" | "→" | "⟶" TreatAsDecl -> symbol sp backarrow> ws SymbolAlts> syntax backarrow backarrow -> "<-" | "<--" | "←" | "⟵" SymbolAlts -> [symbol {ws op:"|" ws symbol}] PriorityDecl -> keyword:"priority" Priorities> aux Priorities Priorities -> ws [LongestMatch {ws op:"<" ws LongestMatch}] LongestMatch -> ws [symbol {ws symbol}] DefaultDecl -> keyword:"default" \s sp keyword:"relation" sp Relation> syntax dots dots -> "..." priority any < dots syntax assignSyntax assignSyntax -> backarrow | ":" expression Expr group AtomicExpr -> symbol -> accentedSymbol -> "(" ws Expr ws ")" empty -> "ε" | '""' | "''" any -> "." | "⋅" | "·" literal -> '"' {+ ~('"' | \n)} '"' | "'" {+ ~("'" | \n)} "'" hexchar -> "\x" {+hexdigit} decchar -> "\d" {+digit} space -> "\s" newline -> "\n" Opt -> op:"[" ws Expr ws op:"]" Rep -> op:"{" ws Expr ws op:"}" Rep1 -> op:"{+" ws Expr ws op:"}" Range -> Expr ws dots ws Expr Complement -> op:"~" ws `Expr Diff -> `Expr ws op:"-" ws Expr SyntaxTreatAs -> symbol ws assignSyntax ws Expr Related -> Expr ws Relation group Front -> layout:"§" ws `Expr Abs -> layout:"@" ws `Expr group OptGreedy -> Expr ws peg:"?" RepGreedy -> Expr ws peg:"*" Rep1Greedy -> Expr ws peg:"+" group And -> peg:"&" ws `Expr Not -> peg:"!" ws `Expr Seq -> [Expr {+ ws Expr}] OrGreedy -> `Expr ws peg:"/" ws Expr Or -> `Expr ws op:"|" ws Expr aux ExpressionPriorities ExpressionPriority ExpressionDecl -> keyword:"expression" sp symbol ExpressionPriorities> ExpressionPriorities -> ws {ExpressionPriority= ws} ExpressionPriority -> §@(ExpressionGroup= | ExpressionDef=) ExpressionDef -> GroupSymbol sp arrow ws Expr> ExpressionGroup -> keyword:"group" sp GroupSymbol ExpressionDefs> ExpressionDefs -> ws {§@ExpressionDefInGroup= ws} ExpressionDefInGroup -> [symbol] sp arrow ws Expr> permeable -> "!" GroupSymbol -> symbol [sp permeable] GroupSymbol -> [permeable]