summaryrefslogtreecommitdiff
path: root/src/piraha/pegs/schedule.peg
blob: 4a19d046fbdd299e16e8a88e0e28fa4c2332ddff (plain)
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
skipper = \b([\ \t\n\r\b]|{-ccomment}|\#[^\n]*|\\[\r\n])*

any = [^]
name = (?i:[a-zA-Z_][a-zA-Z0-9_\-]*\b)
expr = {name}|{num}
vname = {name}( :: {name})*( \[ {expr} \]|)
quote = "(\\{any}|[^"])*"
ccomment = /\*((?!\*/){-any})*\*/
num = [+\-]?[0-9]+(\.[0-9]+)?
string = {name}|{quote}
term = {num}|{name}
par = \b(?i:as|at|in|while|if|before|after|while)\b
pararg = ({vname}|\( {vname}( ,? {vname} )* \))
assign = {name} = {num}

boolpar = \( {boolexpr} \)
eqfun = (?i:CCTK_Equals)
actfun = (?i:CCTK_IsThornActive)
actifun = (?i:CCTK_IsImplementationActive)
booleq  = {eqfun} \( {string} , {string} \)
boolact = ({actfun}|{actifun}) \( {string} \)
boolstar = \* {name}
boolneg = \! {boolexpr}
boolterm = (?i:{boolneg}
         | {boolpar}
         | {booleq}
         | {boolact}
         | {boolstar}
         | {name} )
         
boolop = (&&|\|\|)
boolcmp = (>=|<=|==|!=|<|>)
boolexpr = {boolterm} ({boolop} {boolexpr} )+
	     | {term} {boolcmp} {term} | {boolterm}

lang = (?i:lang(uage|) : {name})
group = (?i:group)
nogroup =
prepositions = ({preposition} )*
preposition = {par} {pararg}
sync = (?i:sync) : {vname}( , {vname}|[ \t]{vname})*
options = (?i:options?) : {vname}( , {vname}|[ \t]{vname})*
storage = (?i:storage) : {vname}( , {vname}|[ \t]{vname})*
triggers = (?i:triggers?) : {vname}( , {vname}|[ \t]{vname})*
reads = (?i:reads) : {qname}( , {qname}|[ \t]{qname})*
writes = (?i:writes) : {qname}( , {qname}|[ \t]{qname})*
qname = {vname}(\({region}(;{region})*\))?
region = (everywhere|interior|boundary_ghostzones|boundary|all_timelevels|all_maps|all_reflevels)
tags = (?i:tags) : {assign}( , {assign}|[ \t]{assign})*
schedule = (?i:
	schedule ({group}|{nogroup}) {name} {prepositions} \{
		( {storage}
        | {lang}
		| {sync}
		| {options}
		| {triggers}
        | {reads}
        | {writes}
        | {tags}
		)*
	\} {quote}
  )
if = (?i:
	if \( {boolexpr} \) {block} (else {if}|else {block}|)
  )
storage = (?i:storage: {vname}( , {vname}|([ \t]|\\\r?\n)+{vname})* )
block = \{ (({statement}|{block}) )* \} | {statement}
	
statement = ({schedule} |{if} |{storage} )
sched = {-skipper}({statement}|{block})*$