6.13 Summary of the Malaga Syntax
The syntax of Malaga source texts is defined formally by a sort of EBNF
notation:
- Terminals like
assert
and := stand for themselves.
- Nonterminals like assignment are defined by productions.
- A bar `|' separates alternatives.
- Brackets `[]' enclose optional parts.
- Curly braces `{}' enclose parts that are repeated zero times, one time, or
multiple times.
- Parentheses `()' are used for grouping.
The start productions for Malaga source texts are
lexicon-file, rule-file, and symbol-file. A
nonterminal marked with * in its definition is a lexical
symbol.
- assert-statement:
- (
assert
| !) condition ;
- assignment:
- path (:= | :=+ | :=- | :=* |
:=/) expression ; | < path {,
path} > := expression ;
- break-statement:
break
[label] ;
- choose-statement:
choose
variable in
expression ;
- comment*:
- # {printing-char}
- comparison:
- [
not
] (expression [comparison-operator
expression] | match-comparison)
- comparison-operator:
- = | /= | ~ | /~ |
in
| less
|
greater
| less_equal
| greater_equal
- condition:
- comparison ({
and
comparison} | {or
comparison})
- constant*:
- @ identifier
- constant-definition:
- (
define
| default
) constant :=
constant-expression ;
- constant-expression:
- expression
- define-statement:
define
variable := expression ; |
define
< variable {, variable}
> := expression ;
- error-statement:
error
expression ;
- expression:
- term {(+ | -) term}
- factor:
- value {. value}
- foreach-statement:
- [label :]
foreach
variable in
expression : statements end
[foreach
] ;
- identifier*:
- (letter | _ | &) {letter | digit |
_ | &}
- if-statement:
if
condition then
statements
{elseif
condition then
statements}
[else
statements] end
[if
] ;
- include:
include
string ;
- initial:
initial
constant-expression , rule-set ;
- label:
- identifier
- lexicon-file:
- {constant-definition | constant-expression ;}
- list:
- < {expression {, expression}} >
- match:
- constant-expression [: variable] | variable
: constant-expression
- match-comparison:
- expression
matches
( ( match {,
match} ) | match {, match} )
- number*:
- digit {digit} ( L | R | [. digit
{digit}] [E digit {digit}] )
- parallel-statement:
parallel
statements {or
statements}
end
[parallel
] ;
- path:
- variable {. value}
- record:
- [ {symbol-value-pair {,
symbol-value-pair}} ]
- repeat-statement:
repeat
statements while
condition ;
statements end
[repeat
] ;
- require-statement:
- (
require
| ?) condition ;
- result-statement:
result
expression [, (rule-set |
accept
)] ;
- return-statement:
return
expression ;
- rule:
- rule-type rule-name ( variable {,
variable} ) : statements
end
[rule-type] [rule-name] ;
- rule-file:
- {rule | constant-definition | initial |
include}
- rule-name:
- identifier
- rule-set:
rules
(rules {else
rules} | (
rules {else
rules} ))
- rule-type:
allo_rule
| combi_rule
| end_rule
|
pruning_rule
| robust_rule
| input_filter
|
output_filter
| subrule
- rules:
- rule-name {, rule-name}
- statements:
- {assert-statement | assignment | choose-statement |
define-statement | error-statement | foreach-statement |
if-statement | parallel-statement | repeat-statement |
require-statement | result-statement | return-statement |
stop-statement}
- stop-statement:
stop
;
- string*:
- " {char-except-double-quotes | \" | \\} "
- subrule-invocation:
- rule-name ( expression {, expression}
- symbol:
- identifier
- symbol-definition:
- symbol [:= < symbol {, symbol}
>] ;
- symbol-file:
- {symbol-definition | include}
- symbol-value-pair:
- expression : expression
- term:
- factor {(* | /) factor}
- value:
- [-] (symbol | string | number | list |
record | constant | subrule-invocation |
variable | ( condition ))
- variable*:
- $ identifier