-
Notifications
You must be signed in to change notification settings - Fork 1
/
peg.peg
41 lines (36 loc) · 1.73 KB
/
peg.peg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# Hierarchical syntax
Grammar <- Spacing Definition+ EndOfFile # The whole grammar file
Definition <- Identifier LEFTARROW Expression # The Definition Definition
Expression <- Sequence (SLASH Sequence)* # Choices
Sequence <- Prefix* # Series of primaries w/ stuff
Prefix <- (AND / NOT)? Suffix # Syntactic predicates
Suffix <- Primary (QUESTION / STAR / PLUS)? # Stuff after a primary
Primary <- Identifier !LEFTARROW # Nonterminal
/ OPEN Expression CLOSE # Subexpression
/ Literal / Class / DOT # Terminal
# Lexical syntax
Identifier <- IdentStart IdentCont* Spacing # Name has to start with a
IdentStart <- [a-zA-Z_] # letter or an underscore
IdentCont <- IdentStart / [0-9] # and can have numbers in it
Literal <- ['] (!['] Char)* ['] Spacing # 'lawl' 'nar' ''
/ ["] (!["] Char)* ["] Spacing # "lawl" "nar" ""
Class <- '[' (!']' Range)* ']' Spacing # [bar] []
Range <- Char '-' Char / Char # a-z L
Char <- '\\' [nrt'"\[\]\\] # \n \r \t \' \" \] \] \\
/ '\\' ([0-2]?[0-7])?[0-7] # \123 \50 \2
/ !'\\' . # Anything else
LEFTARROW <- '<-' Spacing
SLASH <- '/' Spacing # Prioritized Choice Operator
AND <- '&' Spacing
NOT <- '!' Spacing
QUESTION <- '?' Spacing
STAR <- '*' Spacing
PLUS <- '+' Spacing
OPEN <- '(' Spacing
CLOSE <- ')' Spacing
DOT <- '.' Spacing
Spacing <- (Space / Comment)*
Comment <- '#' (!EndOfLine .)* EndOfLine
Space <- ' ' / '\t' / EndOfLine
EndOfLine <- '\r\n' / '\n' / '\r'
EndOfFile <- !.