/
peg.peg
60 lines (35 loc) · 1.98 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
grammar Canopy.PEG
grammar <- space* grammar_name
rules:(space* grammar_rule)+ space*
grammar_name <- "grammar " object_identifier
grammar_rule <- identifier assignment parsing_expression
assignment <- space+ "<-" space+
parsing_expression <- choice_expression / choice_part
parenthesised_expression <- "(" space* parsing_expression space* ")"
choice_expression <- first_part:choice_part
rest:(space+ "/" space+ expression:choice_part)+
choice_part <- (sequence_expression / sequence_part)
(space+ type_expression)?
type_expression <- "<" object_identifier ">"
sequence_expression <- first_part:sequence_part
rest:(space+ expression:sequence_part)+
sequence_part <- label? expression:(quantified_atom / atom)
quantified_atom <- atom quantifier
atom <- parenthesised_expression
/ predicated_atom
/ reference_expression
/ string_expression
/ ci_string_expression
/ any_char_expression
/ char_class_expression
predicated_atom <- predicate:("&" / "!") atom
reference_expression <- identifier !assignment
string_expression <- "\"" ("\\" . / [^"])* "\""
ci_string_expression <- "`" ("\\" . / [^`])* "`"
any_char_expression <- "."
char_class_expression <- "[" "^"? ("\\" . / [^\]])+ "]"
label <- identifier ":"
object_identifier <- identifier ("." identifier)*
identifier <- [a-zA-Z_$] [a-zA-Z0-9_$]*
quantifier <- "?" / "*" / "+"
space <- [\s\n\r\t]