PEG grammar for PEG itself from 200 paper as a staring point.
[cl-opossum.git] / opossum.peg
blob2df53f09409d4606e94e7c8ad7a0a000d87be82b
1 ## -*- mode: peg -*-
2 ## $Id:$ 
3 ## PEG syntax in PEG as in the original report
5 # Hierarchical syntax
6 Grammar <- 
7         Spacing
8         Definition+
9         EndOfFile
11 Definition <- Identifier LEFTARROW Expression
13 Expression <- Sequence (SLASH Sequence)*
15 Sequence <- Prefix*
17 Prefix <- (AND / NOT)? Suffix
19 Suffix <- Primary (QUESTION / STAR / PLUS)?
21 Primary <- 
22           Identifier !LEFTARROW
23         / OPEN Expression CLOSE
24         / Literal
25         / Class
26         / DOT
28 # Lexical syntax
29 Identifier <- IdentStart IdentCont* Spacing
30 IdentStart <- [a-zA-Z_]
31 IdentCont  <- IdentStart / [0-9]
32 Literal    <- 
33           ['] (!['] Char)* ['] Spacing
34         / ["] (!["] Char)* ["] Spacing
35 Class      <-
36         '[' (!']' Range)* ']' Spacing
37 Range <- Char '-' Char / Char
38 Char <- 
39           '\\' [nrt'"\[\]\\]    #' ...un-confuse emacs highlighting
40         / '\\' [0-2][0-7][0-7]
41         / '\\' [0-7][0-7]?
42         / !'\\' .
43                                 
45 LEFTARROW <- '<-' Spacing
46 SLASH     <- '/'  Spacing
47 AND       <- '&'  Spacing
48 NOT       <- '!'  Spacing
49 QUESTION  <- '?'  Spacing
50 STAR      <- '*'  Spacing
51 PLUS      <- '+'  Spacing
52 OPEN      <- '('  Spacing
53 CLOSE     <- ')'  Spacing
54 DOT       <- '.'  Spacing
55 Spacing   <- (Space / Comment)*
56 Comment   <- '#' (!EndOfLine .)* EndOfLine
57 Space     <- ' ' / '\t' / EndOfLine
58 EndOfLine <- '\r\n' / '\n' / '\r'
59 EndOfFile <- !.