# Author: Jonathan Nelisse
#
# If a production rule can be empty, it is marked with Follow(<Fieldname>)
# The letters and digits are not tokenized.

##########
# keywords

head            HEAD
tail            TAIL
if              IF
then            THEN
else            ELSE
length          LENGTH
card            CARD
true            TRUE
false           FALSE
and             AND
or              OR
not             NOT
null            NULL
elem            ELEM
member          MEMBER
empty           EMPTY
concat          CONCAT
union           BIN_UNION
inter           BIN_INTER
diff            DIFF
Union           UNION
Inter           INTER
set             SEQ_TO_SET
Set             SET_TO_SET
Seq             SEQ_TO_SEQSET
extensions      EXTENSIONS
productions     PRODUCTIONS
let             LET
within          WITHIN
Int             INT
Bool            BOOL
nametype        NAMETYPE
datatype        DATATYPE
subtype         SUBTYPE
channel         CHANNEL
Events          EVENTS
STOP            PROC_STOP
SKIP            PROC_SKIP
CHAOS           PROC_CHAOS
external        EXTERNAL
transparant     TRANSPARENT
normal          NORMAL
normalise       NORMALISE
normalize       NORMALIZE
sbsim           SBSIM
tau_loop_factor TAU_LOOP_FACTOR
diamond         DIAMOND
model_compress  MODEL_COMPRESS
explicate       EXPLICATE
assert          ASSERT
deterministic   DETERMINISTIC
deadlock free   DEADLOCK_FREE
livelock free   LIVELOCK_FREE
divergence free DIVERGENCE_FREE
T               TRACES
F               FAILURES
FD              FAILURES_DIVERGENCES
print           PRINT
attribute       ATTRIBUTE
embed           EMBED
module          MODULE
include         INCLUDE
freetype        FREETYPE
pragma          PRAGMA
endmodule       ENDMODULE
instance        INSTANCE
ldot            LDOT
lambda          LAMBDA

########
# tokens

(               LPARENTHESIS
)               RPARENTHESIS
#               SHARP
+               PLUS
-               MINUS
*               TIMES
/               DIV
%               MOD
==              EQUAL
!=              NOT_EQUAL
<               LESS
<=              LESS_OR_EQUAL
>               GREATER
>=              GREATER_OR_EQUAL
{               LBRACE
}               RBRACE
|               BAR
{|              LBRACEBAR
|}              RBRACEBAR
,               COMMA
^               CAT
.               DOT
\               BACKSLASH
@               AT
..              DOTDOT
<-              MAP
=               DEF
:               COLON
"               DOUBLE_QUOTE
'               PRIME
->              PREFIX
[]              EXTERNAL_CHOICE
|~|             INTERNAL_CHOICE
;               SEMICOLON
[>              UNTIMED_TIMEOUT
/\              INTERRUPT
[[              LRENAME
]]              RRENAME
|||             INTERLEAVE
[|              LSQUAREBRACKETBAR
|]              RSQUAREBRACKETBAR
|[              LBARSQUAREBRACKET
]|              RBARSQUAREBRACKET
[               LSQUAREBRACKET
||              BARBAR
]               RSQUAREBRACKET
?               QUESTION_MARK
!               EXCLAMATION_MARK
<->             LINK
~               TILDE
$               DOLLAR
_               UNDERSCORE
@@              ATAT

##################
# Production rules

<Any> ::= <Expr> | <Proc>

<Exprs> ::= <Expr> | <Expr> COMMA <Exprs>

<Expr> ::= <Numb> | <Bool> | <Set> | <Seq> | <Tuple> | <Dotted> | <Lambda>

<Numb> ::= <Numb1> PLUS <Numb> | <Numb1> MINUS <Numb> | <Numb1>
<Numb1> ::= <Numb2> TIMES <Numb1> | <Numb2> DIV <Numb1> | <Numb2> MOD <Numb1> | <Numb2>
<Numb2> ::= MIN <Numb3> | <Numb3>
<Numb3> ::= <Number> | CARD LPARENTHESIS <Set> RPARENTHESIS | SHARP LPARENTHESIS <Seq> RPARENTHESIS | LENGTH LPARENTHESIS <Seq> RPARENTHESIS | <Common>

<Bool> ::= <Bool1> OR <Bool> | <Bool1>
<Bool1> ::= <Bool2> AND <Bool1> | <Bool2>
<Bool2> ::= NOT <Bool3> | <Bool3>
<Bool3> ::= TRUE | FALSE | NULL LPARENTHESIS <Seq> RPARENTHESIS | ELEM LPARENTHESIS <Expr> COMMA <Seq> RPARENTHESIS | MEMBER LPARENTHESIS <Expr> COMMA <Set> RPARENTHESIS | EMPTY LPARENTHESIS <Set> RPARENTHESIS |
            <Expr> LESS <Expr> | <Expr> LESS_OR_EQUAL <Expr> | <Expr> GREATER <Expr> | <Expr> GREATER_OR_EQUAL <Expr> | <Bool4>
<Bool4> ::= <Expr> EQUAL <Expr> | <Expr> NOT_EQUAL <Expr> | <Common>

<Set> ::= <Common> | LBRACE <Targ> RBRACE | LBRACEBAR <Targ> RBRACEBAR | BIN_UNION LPARENTHESIS <Set> COMMA <Set> RPARENTHESIS | BIN_INTER LPARENTHESIS <Set> COMMA <Set> RPARENTHESIS | DIFF LPARENTHESIS <Set> COMMA <Set> RPARENTHESIS | UNION LPARENTHESIS <Set> RPARENTHESIS | INTER LPARENTHESIS <Set> RPARENTHESIS | SEQ_TO_SET LPARENTHESIS <Seq> RPARENTHESIS | SET_TO_SET LPARENTHESIS <Set> RPARENTHESIS | SEQ_TO_SEQSET LPARENTHESIS <Seq> RPARENTHESIS | EXTENSIONS LPARENTHESIS <Expr> RPARENTHESIS | PRODUCTIONS LPARENTHESIS <Expr> RPARENTHESIS

<Seq> ::= <Seq1> CAT <Seq> | CONCAT LPARENTHESIS <Seq1> RPARENTHESIS | <Seq1>
<Seq1> ::= HEAD LPARENTHESIS <Seq2> RPARENTHESIS | TAIL LPARENTHESIS <Seq2> RPARENTHESIS | <Seq2>
<Seq2> ::= LESS <Targ> GREATER | <Common>

<Tuple> ::= <Common> | LPARENTHESIS <Exprs> RPARENTHESIS

<Dotted> ::= <Common> | <Expr> DOT <Expr>

<Lambda> ::= <Common> | BACKSLASH <Exprs> AT <Any>

<Common> ::= IF <Bool> THEN <Any> ELSE <Any> | <Name> | <Lambda> LPARENTHESIS <Exprs> RPARENTHESIS | LET <Defns> WITHIN <Any> | LPARENTHESIS <Any> RPARENTHESIS | <Any> ATAT <Any>

<Targ> ::= Follow(<Targ>) | <Exprs> | <Numb> DOTDOT <Numb> | <Numb> DOTDOT | <Expr> BAR <Comprehensions>

<Comprehensions> ::= <Comprehension> | <Comprehension> COMMA <Comprehensions>

<Comprehension> ::= Follow(<Comprehension>) | <Bool> | <Expr> MAP <Expr>

<SetGen> ::= <Expr> COLON <Set>

<SeqGen> ::= <Expr> COLON <Seq>

<Defns> ::= <Defn> | <Defn> <Defns>

<Defn> ::= <Any> DEF <Any> | <ChannelTrans> | PRAGMA <ChannelTrans> | NAMETYPE <Name> DEF <Type> | DATATYPE <Name> DEF <VarType> | SUBTYPE <Name> DEF <VarType> | EXTERNAL <Names> | ASSERT <Check> | PRINT <Expr> | INCLUDE DOUBLE_QUOTE <FileName> DOUBLE_QUOTE

<ChannelTrans> ::= CHANNEL <Names> COLON <Type> | CHANNEL <Names> | TRANSPARENT <TrNames>

<VarType> ::= <Branch> | <Branch> BAR <VarType>

<Branch> ::= <Name> | <Name> DOT <Type>

<Types> ::= <Type> | <Type> COMMA <Types>

<Type> ::= <Type> DOT <Type> | LPARENTHESIS <Types> RPARENTHESIS | <Set> | <Name> | <Name> LPARENTHESIS <Types> RPARENTHESIS

<Names> ::= <Name> | <Name> COMMA <Names>

<Proc> ::= INTERLEAVE <SetGen> AT <Proc1> | <Proc1>
<Proc1> ::= LBRACKET <LinkPar> RBRACKET <SeqGen> AT <Proc2> | BARBAR <SetGen> AT LSQUAREBRACKET <Set> RSQUAREBRACKET <Proc2> | LSQUAREBRACKETBAR <Set> RSQUAREBRACKETBAR <SetGen> AT <Proc2> | LBARSQUAREBRACKET <Set> RBARSQUAREBRACKET <SetGen> AT <Proc2> | <Proc2>
<Proc2> ::= INTERNAL_CHOICE <SetGen> AT <Proc3> | <Proc3>
<Proc3> ::= EXTERNAL_CHOICE <SetGen> AT <Proc4> | <Proc4>
<Proc4> ::= SEMICOLON <SeqGen> AT <Proc5> | <Proc5>
<Proc5> ::= <Proc6> BACKSLASH <Set> | <Proc6>
<Proc6> ::= <Proc7> INTERLEAVE <Proc6> | <Proc7>
<Proc7> ::= <Proc8> LBRACKET <LinkPar> RBRACKET <Proc7> | <Proc8> LSQUAREBRACKET <Set> BARBAR <Set> RSQUAREBRACKET <Proc7> | <Proc8> LSQUAREBRACKETBAR <Set> RSQUAREBRACKETBAR <Proc7> | <Proc8> LBARSQUAREBRACKET <Set> RBARSQUAREBRACKET <Proc7> | <Proc8>
<Proc8> ::= <Proc9> INTERNAL CHOICE <Proc8> | <Proc9>
<Proc9> ::= <Proc10> EXTERNAL_CHOICE <Proc9> | <Proc10>
<Proc10> ::= <Proc11> INTERRUPT <Proc10> | <Proc11>
<Proc11> ::= <Proc12> UNTIMED_TIMEOUT <Proc11> | <Proc12>
<Proc12> ::= <Proc13> SEMICOLON <Proc12> | <Proc13>
<Proc13> ::= <Bool> GUARD <Proc14> | <Dotted> <Fields> PREFIX <Proc14> | <Proc14>
<Proc14> ::= <Proc15> LRENAME <Rename> RRENAME | <Proc15>
<Proc15> ::= STOP | SKIP | CHAOS LPARENTHESIS <Set> RPARENTHESIS | <Common>

<Fields> ::= Follow(<Field>) | <Field> COMMA <Fields>

<Field> ::= QUESTION_MARK <Expr> | QUESTION_MARK <Expr> COLON <Expr> | EXCLAMATION_MARK <Expr>

<Rename> ::= <Maps> | <Maps> BAR <Comprehensions>

<Maps> ::= <Map> | <Map> COMMA <Maps>

<Map> ::= <Dotted> MAP <Dotted>

<LinkPar> ::= <Links> | <Links> BAR <Comprehensions>

<Links> ::= <Link> | <Link>COMMA <Links>

<Link> ::= <Dotted> LINK <Dotted>

<Check> ::= <Bool> | <Proc> <Refined> <Proc> | <Proc> COLON LBRACKET <Test> RBRACKET | NOT <Check>

<Refined> ::= LBRACKET <Model> DEF

<Model> ::= Follow(<Model>) | TRACES | <FailureModel>

<FailureModel> ::= FAILURES | FAILURES_DIVERGENCES

<Test> ::= <TestType> | <TestType>  LBRACKET <FailureModel> RBRACKET | DIVERGENCE_FREE

<TestType> ::= DETERMINISTIC | DEADLOCK_FREE | LIVELOCK_FREE

<TrNames> ::= <TrName> | <TrName> COMMA <TrNames>

<TrName> ::= NORMAL | NORMALISE | NORMALIZE | SBSIM | TAU_LOOP_FACTOR | DIAMOND | MODEL_COMPRESS | EXPLICATE

<FileName> ::= <Name> | <Name> DOT <FileName>

<Name> ::= <letter><alphanumunder><primes>

<letter> ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"

<alphanumunder> ::= Follow(<alphanumber>) | <letter><alphanumunder> | <digit><alphanumunder> | UNDERSCORE <alphanumunder>

<primes> ::= Follow(<primes>) | PRIME <primes>

<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

<pos> ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

<Number> ::= "0" | <posnumber>

<posnumber> ::= <pos> | <posnumber><digit>
