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 `;