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