This repository has been archived by the owner on Feb 3, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 8
/
Grammar.pm
127 lines (93 loc) · 2.56 KB
/
Grammar.pm
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
120
121
122
123
124
125
126
127
grammar NQP::Grammar is HLL::Grammar;
token TOP { <statementlist> [ $ || <.panic: 'Confused'> ] }
rule statementlist {
| $
| [<statement><.eat_terminator> ]*
}
token statement {
<!before <[\])}]> | $ >
[
| <statement_control>
| <EXPR>
]
}
token eat_terminator {
| ';'
| <?terminator>
| $
}
token xblock {
<EXPR> <.ws> <pblock>
}
token pblock {
<?[{]>
<.newpad>
<blockoid>
}
token blockoid {
<.finishpad>
'{' ~ '}' <statementlist>
}
token newpad { <?> }
token finishpad { <?> }
proto token terminator { <...> }
token terminator:sym<;> { <?[;]> }
token terminator:sym<}> { <?[}]> }
## Statement control
proto token statement_control { <...> }
token statement_control:sym<if> {
$<sym>=['if'] :s
<xblock>
[ 'elsif'\s <xblock> ]*
[ 'else'\s <else=pblock> ]?
}
## Terms
proto token term { <...> }
token term:sym<identifier> {
<ident> <args>
}
token args {
| '(' <arglist> ')'
}
token arglist {
<.ws>
[
| <EXPR>
| <?>
]
}
token term:sym<value> { <value> }
token value {
| <integer>
| <quote>
}
proto token quote { <...> }
token quote:sym<apos> { <?[']> <quote_EXPR: ':q'> }
token quote:sym<dblq> { <?["]> <quote_EXPR: ':qq'> }
token quote:sym<q> { 'q' <![(]> <.ws> <quote_EXPR: ':q'> }
token quote:sym<qq> { 'qq' <![(]> <.ws> <quote_EXPR: ':qq'> }
token quote:sym<Q> { 'Q' <![(]> <.ws> <quote_EXPR> }
token circumfix:sym<( )> { '(' <EXPR> ')' }
token circumfix:sym<ang> { <?[<]> <quote_EXPR: ':q', ':w'> }
token circumfix:sym<{ }> { <?[{]> <pblock> }
## Operators
token nulltermish {
| <OPER=noun=noun>
| <?>
}
token postcircumfix:sym<[ ]> {
'[' <EXPR> ']'
<O('%methodop')>
}
token prefix:sym<--> { $<sym>=['--'] <O('%autoincrement')> }
token postfix:sym<++> { $<sym>=['++'] <O('%autoincrement')> }
token infix:sym<**> { $<sym>=['**'] <O('%exponentiation, :pirop<pow>')> }
token prefix:sym<-> { $<sym>=['-'] <O('%symbolic_unary')> }
token infix:sym<*> { $<sym>=['*'] <O('%multiplicative, :pirop<mul>')> }
token infix:sym</> { $<sym>=['/'] <O('%multiplicative, :pirop<div>')> }
token infix:sym<%> { $<sym>=['%'] <O('%multiplicative, :pirop<mod>')> }
token infix:sym<+> { $<sym>=['+'] <O('%additive, :pirop<add>')> }
token infix:sym<-> { $<sym>=['-'] <O('%additive, :pirop<sub>')> }
token infix:sym<~> { $<sym>=['~'] <O('%concatenation , :pirop<concat>')> }
token infix:sym<:=> { $<sym>=[':='] <O('%assignment, :pasttype<bind>')> }
token infix:sym<,> { $<sym>=[','] <O('%comma')> }