-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRFPL.g4
47 lines (45 loc) · 1.48 KB
/
RFPL.g4
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
grammar RFPL;
// Parser rules (start with lowercase)
singleline : line? EOF ;
line : define
| examine
| pragma ;
pragma : load ;
load : 'load' module ;
module : Symbol ('.' Symbol)* ;
define : Symbol '=' fexpr ;
examine : nexpr ;
symbollist : Symbol (',' Symbol)* ;
fexpr : fexprleaf
| builtinCn
| builtinPr
| builtinMn
| identity
| constant
| bracket ;
fexprleaf : Lazy? Symbol
| Lazy? Symbol '[' fexprlist ']' ;
fexprlist : fexpr (',' fexpr)* ;
builtinCn : Lazy? 'Cn' '[' fexprlist identityRest ']' ;
identityRest : ',' '!' Number '..' | ;
builtinPr : Lazy? 'Pr' '[' fexpr ',' fexpr ']' ;
builtinMn : Lazy? 'Mn' '[' fexpr ']' ;
identity : '!' Number ;
constant : '#' natural ;
bracket : Lazy? '@' Number ;
nexpr : fexpr '(' nexprlist ')'
| natural ;
nexprlist : /* epsilon */
| nexpr (',' nexpr)* ;
natural : Number
| '<' naturallist '>'
| '_' ; /* similar to bottom symbol */
naturallist : /* epsilon */
| natural (',' natural)* ;
// Lexer rules (start with uppercase)
Lazy : '~' ;
Number : [0-9]+ ;
Symbol : [-a-zA-Z_][-a-zA-Z0-9_]* ;
Whitespace : [ \t\r\n]+ -> channel(HIDDEN) ; // Skip whitespace
Comment : ';' ~[\n]* -> channel(HIDDEN) ;
Unknown : . ;