-
Notifications
You must be signed in to change notification settings - Fork 2
/
Coco.ebnf
119 lines (81 loc) · 3.55 KB
/
Coco.ebnf
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
Coco ::=
// using statements
ANY*
"COMPILER" ident
ANY*
"IGNORECASE"? /* pdt */
( "CHARACTERS" SetDecl*)?
( "TOKENS" TokenDecl*)?
( "PRAGMAS" TokenDecl*)?
( "COMMENTS" "FROM" TokenExpr "TO" TokenExpr "NESTED"?)*
( "IGNORE" Set )*
SYNC
"PRODUCTIONS"
( ident AttrDecl? SemText? WEAK '=' Expression WEAK '.' )*
"END" ident '.'
/*------------------------------------------------------------------------------------*/
SetDecl ::= ident '=' Set '.'
/*------------------------------------------------------------------------------------*/
Set ::= SimSet ( '+' SimSet | '-' SimSet )*
/*------------------------------------------------------------------------------------*/
SimSet ::= ident
| string
| Char ( '..' Char )?
| 'ANY'
/*--------------------------------------------------------------------------------------*/
Char ::= char
/*------------------------------------------------------------------------------------*/
TokenDecl ::= Sym SYNC ( '=' TokenExpr '.' )? SemText?
/*------------------------------------------------------------------------------------*/
AttrDecl ::= '<' ( ANY | badString )* '>'
| '<.' ( ANY | badString )* '.>'
/*------------------------------------------------------------------------------------*/
Expression ::= Term ( WEAK '|' Term )*
/*------------------------------------------------------------------------------------*/
Term ::= Resolver? Factor+
/*------------------------------------------------------------------------------------*/
Factor ::= 'WEAK'? Sym Attribs?
| '(' Expression ')'
| '[' Expression ']'
| '{' Expression '}'
| SemText
| 'ANY'
| 'SYNC'
/*------------------------------------------------------------------------------------*/
Resolver ::= "IF" "(" Condition
/*------------------------------------------------------------------------------------*/
Condition ::= ( "(" Condition | ANY )* ")"
/*------------------------------------------------------------------------------------*/
TokenExpr ::= TokenTerm ( WEAK '|' TokenTerm )*
/*------------------------------------------------------------------------------------*/
TokenTerm ::= TokenFactor+ ( 'CONTEXT' '(' TokenExpr ')' )?
/*------------------------------------------------------------------------------------*/
TokenFactor ::= Sym
| '(' TokenExpr ')'
| '[' TokenExpr ']'
| '{' TokenExpr '}'
/*------------------------------------------------------------------------------------*/
Sym ::= ident
| string
| char
/*------------------------------------------------------------------------------------*/
Attribs ::= '<' ( ANY | badString )* '>'
| '<.' ( ANY | badString )* '.>'
/*------------------------------------------------------------------------------------*/
SemText ::= "(." ( ANY | badString | "(." )* ".)"
/* ---- TOKENS ----- */
ident ::= letter ( letter | digit )*
number ::= digit+
string ::= '"' ( stringCh | '\' printable )* '"'
badString ::= '"' ( stringCh | '\' printable )* (cr | lf)
char ::= "'" ( charCh | '\' printable hex* ) "'"
/* ---- CHARACTERS ----- */
letter ::= [A-Za-z_]
digit ::= [0-9]
cr ::= #xD
lf ::= #xA
tab ::= #x9
stringCh ::= [^"\#xD#xA] //ANY - '"' - '\\' - cr - lf
charCh ::= [^'\#xD#xA] //ANY - '\'' - '\\' - cr - lf
printable ::= [#x0020-#x007e]
hex ::= (digit | [a-f])+