1 module pegged.examples.peggedgrammar; 2 3 import pegged.grammar; 4 5 enum PEGGEDgrammar = ` 6 # This is the PEG extended grammar used by Pegged 7 Pegged: 8 9 # Syntactic rules: 10 Grammar <- Spacing GrammarName Definition+ :eoi 11 Definition <- LhsName Arrow Expression 12 Expression <- :OR? Sequence (:OR Sequence)* 13 Sequence <- Prefix+ 14 Prefix <- (POS / NEG / FUSE / DISCARD / KEEP / DROP / PROPAGATE)* Suffix 15 Suffix <- Primary (OPTION / ZEROORMORE / ONEORMORE / Action)* 16 Primary <- !(LhsName Arrow) 17 ( RhsName 18 / :OPEN Expression :CLOSE 19 / Literal 20 / CharClass 21 / ANY) 22 # Lexical syntax 23 Identifier <- identifier 24 GrammarName <- Identifier ParamList? Spacing :':' Spacing 25 LhsName <- Identifier ParamList? Spacing 26 RhsName <- Identifier ArgList? (NAMESEP Identifier ArgList?)* Spacing # NAMESEP is *not* discarded 27 ParamList <- :OPEN Param (:SEPARATOR Param)* :CLOSE 28 Param <- DefaultParam / SingleParam 29 DefaultParam <- Identifier Spacing :ASSIGN Expression 30 SingleParam <- Identifier Spacing 31 ArgList <- :OPEN Expression (:SEPARATOR Expression)* :CLOSE 32 33 Literal <- quote ~(!quote Char)* quote Spacing 34 / doublequote ~(!doublequote Char)* doublequote Spacing 35 CharClass <- :'[' (!']' CharRange)* :']' Spacing 36 CharRange <- Char '-' Char / Char 37 38 # Terminals 39 Char <~ backslash ( quote 40 / doublequote 41 / backquote 42 / backslash 43 / '-' 44 / '[' 45 / ']' 46 / [nrt] 47 / [0-2][0-7][0-7] 48 / [0-7][0-7]? 49 / 'x' hexDigit hexDigit 50 / 'u' hexDigit hexDigit hexDigit hexDigit 51 / 'U' hexDigit hexDigit hexDigit hexDigit hexDigit hexDigit hexDigit hexDigit 52 ) 53 / . # or anything else 54 55 Arrow <- LEFTARROW / FUSEARROW / DISCARDARROW / KEEPARROW / DROPARROW / PROPAGATEARROW / ACTIONARROW / SPACEARROW 56 LEFTARROW <- '<-' Spacing 57 FUSEARROW <- '<~' Spacing 58 DISCARDARROW <- '<:' Spacing 59 KEEPARROW <- '<^' Spacing 60 DROPARROW <- '<;' Spacing 61 PROPAGATEARROW <- '<%' Spacing 62 SPACEARROW <- '<' Spacing 63 ACTIONARROW <- '<' Action Spacing 64 65 OR <- '/' Spacing 66 67 POS <- '&' Spacing 68 NEG <- '!' Spacing 69 FUSE <- '~' Spacing 70 DISCARD <- ':' Spacing 71 KEEP <- '^' Spacing 72 DROP <- ';' Spacing 73 PROPAGATE <- '%' Spacing 74 75 OPTION <- '?' Spacing 76 ZEROORMORE <- '*' Spacing 77 ONEORMORE <- '+' Spacing 78 ACTIONOPEN <- '{' Spacing 79 ACTIONCLOSE <- '}' Spacing 80 SEPARATOR <- ',' Spacing 81 ASSIGN <- '=' Spacing 82 NAMESEP <- '.' # No Spacing 83 OPEN <- '(' Spacing 84 CLOSE <- ')' Spacing 85 ANY <- '.' Spacing 86 Spacing <: (blank / Comment)* 87 Comment <- '#' (!eol .)* :eol 88 Space <- spacing / "\\t" / "\\n" / "\\r" 89 90 # Action Rule 91 Action <- :ACTIONOPEN Spacing ((Lambda / qualifiedIdentifier) 92 (:SEPARATOR (Lambda / qualifiedIdentifier))*) Spacing :ACTIONCLOSE 93 Lambda <~ (!(ACTIONCLOSE/SEPARATOR) (LambdaItems / NestedList('{',LambdaItems,'}') / .))* 94 95 LambdaItems <- ~DComment / ~DString / ~DParamList 96 DString <- WYSString / DBQString / TKNString / DLMString 97 98 WYSString <- 'r' doublequote (!doublequote .)* doublequote / 99 backquote (!backquote .)* backquote 100 101 DBQString <- doublequote (!doublequote Char)* doublequote 102 103 TKNString <- (&'q{' ('q' NestedList('{',DString,'}'))) 104 105 DLMString <- ('q' doublequote) ( (&'{' NestedList('{',DString,'}')) 106 / (&'[' NestedList('[',DString,']')) 107 / (&'(' NestedList('(',DString,')')) 108 / (&'<' NestedList('<',DString,'>')) 109 ) doublequote 110 111 DComment <- DLineComment / DBlockComment / DNestingBlockComment 112 113 DLineComment <- "//" (!endOfLine .)* endOfLine 114 DBlockComment <- "/*" (!"*/" .)* "*/" 115 DNestingBlockComment <- NestedList("/+","+/") 116 117 DParamList <- NestedList('(',')') 118 119 # Linear nested lists with and without special items 120 NestedList(L,Items,R) <- ^L ( !(L/R/Items) . )* ( Items 121 / NestedList(L,Items,R) 122 / ( !(L/R/Items) . )* 123 )* ( !(L/R/Items) . )* ^R 124 125 NestedList(L,R) <- ^L ( !(L/R) . )* (NestedList(L,R) / ( !(L/R) . )*)* ( !(L/R) . )* ^R 126 `;