20. Appendix: NED Language Grammar¶
This appendix contains the grammar for the NED language.
In the NED language, space, horizontal tab and new line characters count as delimiters, so one or more of them is required between two elements of the description which would otherwise be unseparable.
The // symbol (two slashes) begin comments that extend to the end of the line.
The language is case sensitive.
Notation:
rule syntax is that of bison
uppercase words are terminals, lowercase words are nonterminals
NAME,STRINGCONSTANT,INTCONSTANT,REALCONSTANTrepresent identifier names and string, integer and real number literals (defined as in the C language, except that a0prefix does not stand for octal notation)other terminals represent keywords in all lowercase
nedfile
: definitions
| %empty
;
definitions
: definitions definition
| definition
;
definition
: packagedeclaration
| import
| propertydecl
| fileproperty
| channeldefinition
| channelinterfacedefinition
| simplemoduledefinition
| compoundmoduledefinition
| networkdefinition
| moduleinterfacedefinition
| ';'
;
packagedeclaration
: PACKAGE dottedname ';'
;
dottedname
: dottedname '.' NAME
| NAME
;
import
: IMPORT importspec ';'
;
importspec
: importspec '.' importname
| importname
;
importname
: importname NAME
| importname '*'
| importname '**'
| NAME
| '*'
| '**'
;
propertydecl
: propertydecl_header opt_inline_properties ';'
| propertydecl_header '(' opt_propertydecl_keys ')' opt_inline_properties ';'
;
propertydecl_header
: PROPERTY '@' PROPNAME
| PROPERTY '@' PROPNAME '[' ']'
;
opt_propertydecl_keys
: propertydecl_keys
| %empty
;
propertydecl_keys
: propertydecl_keys ';' propertydecl_key
| propertydecl_key
;
propertydecl_key
: property_literal
;
fileproperty
: property_namevalue ';'
;
channeldefinition
: channelheader '{'
opt_paramblock
'}'
;
channelheader
: CHANNEL NAME
opt_inheritance
;
opt_inheritance
: %empty
| EXTENDS extendsname
| LIKE likenames
| EXTENDS extendsname LIKE likenames
;
extendsname
: dottedname
;
likenames
: likenames ',' likename
| likename
;
likename
: dottedname
;
channelinterfacedefinition
: channelinterfaceheader '{'
opt_paramblock
'}'
;
channelinterfaceheader
: CHANNELINTERFACE NAME
opt_interfaceinheritance
;
opt_interfaceinheritance
: EXTENDS extendsnames
| %empty
;
extendsnames
: extendsnames ',' extendsname
| extendsname
;
simplemoduledefinition
: simplemoduleheader '{'
opt_paramblock
opt_gateblock
'}'
;
simplemoduleheader
: SIMPLE NAME
opt_inheritance
;
compoundmoduledefinition
: compoundmoduleheader '{'
opt_paramblock
opt_gateblock
opt_typeblock
opt_submodblock
opt_connblock
'}'
;
compoundmoduleheader
: MODULE NAME
opt_inheritance
;
networkdefinition
: networkheader '{'
opt_paramblock
opt_gateblock
opt_typeblock
opt_submodblock
opt_connblock
'}'
;
networkheader
: NETWORK NAME
opt_inheritance
;
moduleinterfacedefinition
: moduleinterfaceheader '{'
opt_paramblock
opt_gateblock
'}'
;
moduleinterfaceheader
: MODULEINTERFACE NAME
opt_interfaceinheritance
;
opt_paramblock
: opt_params
| PARAMETERS ':'
opt_params
;
opt_params
: params
| %empty
;
params
: params paramsitem
| paramsitem
;
paramsitem
: param
| property
;
param
: param_typenamevalue
| parampattern_value
;
param_typenamevalue
: param_typename opt_inline_properties ';'
| param_typename opt_inline_properties '=' paramvalue opt_inline_properties ';'
;
param_typename
: opt_volatile paramtype NAME
| NAME
;
parampattern_value
: parampattern opt_inline_properties '=' paramvalue ';'
;
paramtype
: DOUBLE
| INT
| STRING
| BOOL
| OBJECT
| XML
;
opt_volatile
: VOLATILE
| %empty
;
paramvalue
: expression
| DEFAULT '(' expression ')'
| DEFAULT
| ASK
;
opt_inline_properties
: inline_properties
| %empty
;
inline_properties
: inline_properties property_namevalue
| property_namevalue
;
parampattern
: pattern
;
pattern
: pattern2 '.' pattern_elem
| pattern2 '.' TYPENAME
;
pattern2
: pattern2 '.' pattern_elem
| pattern_elem
;
pattern_elem
: pattern_name
| pattern_name '[' pattern_index ']'
| pattern_name '[' '*' ']'
| '**'
;
pattern_name
: NAME
| NAME '$' NAME
| CHANNEL
| '{' pattern_index '}'
| '*'
| pattern_name NAME
| pattern_name '{' pattern_index '}'
| pattern_name '*'
;
pattern_index
: INTCONSTANT
| INTCONSTANT '..' INTCONSTANT
| '..' INTCONSTANT
| INTCONSTANT '..'
;
property
: property_namevalue ';'
;
property_namevalue
: property_name
| property_name '(' opt_property_keys ')'
;
property_name
: '@' PROPNAME
| '@' PROPNAME '[' PROPNAME ']'
;
opt_property_keys
: property_keys
;
property_keys
: property_keys ';' property_key
| property_key
;
property_key
: property_literal '=' property_values
| property_values
;
property_values
: property_values ',' property_value
| property_value
;
property_value
: property_literal
| %empty
;
property_literal
: property_literal CHAR
| property_literal STRINGCONSTANT
| CHAR
| STRINGCONSTANT
;
opt_gateblock
: gateblock
| %empty
;
gateblock
: GATES ':'
opt_gates
;
opt_gates
: gates
| %empty
;
gates
: gates gate
| gate
;
gate
: gate_typenamesize
opt_inline_properties ';'
;
gate_typenamesize
: gatetype NAME
| gatetype NAME '[' ']'
| gatetype NAME vector
| NAME
| NAME '[' ']'
| NAME vector
;
gatetype
: INPUT
| OUTPUT
| INOUT
;
opt_typeblock
: typeblock
| %empty
;
typeblock
: TYPES ':'
opt_localtypes
;
opt_localtypes
: localtypes
| %empty
;
localtypes
: localtypes localtype
| localtype
;
localtype
: propertydecl
| channeldefinition
| channelinterfacedefinition
| simplemoduledefinition
| compoundmoduledefinition
| networkdefinition
| moduleinterfacedefinition
| ';'
;
opt_submodblock
: submodblock
| %empty
;
submodblock
: SUBMODULES ':'
opt_submodules
;
opt_submodules
: submodules
| %empty
;
submodules
: submodules submodule
| submodule
;
submodule
: submoduleheader ';'
| submoduleheader '{'
opt_paramblock
opt_gateblock
'}' opt_semicolon
;
submoduleheader
: submodulename ':' dottedname opt_condition
| submodulename ':' likeexpr LIKE dottedname opt_condition
;
submodulename
: NAME
| NAME vector
;
likeexpr
: '<' '>'
| '<' expression '>'
| '<' DEFAULT '(' expression ')' '>'
;
opt_condition
: condition
| %empty
;
opt_connblock
: connblock
| %empty
;
connblock
: CONNECTIONS ALLOWUNCONNECTED ':'
opt_connections
| CONNECTIONS ':'
opt_connections
;
opt_connections
: connections
| %empty
;
connections
: connections connectionsitem
| connectionsitem
;
connectionsitem
: connectiongroup
| connection opt_loops_and_conditions ';'
;
connectiongroup
: opt_loops_and_conditions '{'
connections '}' opt_semicolon
;
opt_loops_and_conditions
: loops_and_conditions
| %empty
;
loops_and_conditions
: loops_and_conditions ',' loop_or_condition
| loop_or_condition
;
loop_or_condition
: loop
| condition
;
loop
: FOR NAME '=' expression '..' expression
;
connection
: leftgatespec '-->' rightgatespec
| leftgatespec '-->' channelspec '-->' rightgatespec
| leftgatespec '<--' rightgatespec
| leftgatespec '<--' channelspec '<--' rightgatespec
| leftgatespec '<-->' rightgatespec
| leftgatespec '<-->' channelspec '<-->' rightgatespec
;
leftgatespec
: leftmod '.' leftgate
| parentleftgate
;
leftmod
: NAME vector
| NAME
;
leftgate
: NAME opt_subgate
| NAME opt_subgate vector
| NAME opt_subgate '++'
;
parentleftgate
: NAME opt_subgate
| NAME opt_subgate vector
| NAME opt_subgate '++'
;
rightgatespec
: rightmod '.' rightgate
| parentrightgate
;
rightmod
: NAME
| NAME vector
;
rightgate
: NAME opt_subgate
| NAME opt_subgate vector
| NAME opt_subgate '++'
;
parentrightgate
: NAME opt_subgate
| NAME opt_subgate vector
| NAME opt_subgate '++'
;
opt_subgate
: '$' NAME
| %empty
;
channelspec
: channelspec_header
| channelspec_header '{'
opt_paramblock
'}'
;
channelspec_header
: opt_channelname
| opt_channelname dottedname
| opt_channelname likeexpr LIKE dottedname
;
opt_channelname
: %empty
| NAME ':'
;
condition
: IF expression
;
vector
: '[' expression ']'
;
expression
: expr
;
expr
: simple_expr
| functioncall
| expr '.' functioncall
| object
| array
| '(' expr ')'
| expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| expr '%' expr
| expr '^' expr
| '-' expr
_
| expr '==' expr
| expr '!=' expr
| expr '>' expr
| expr '>=' expr
| expr '<' expr
| expr '<=' expr
| expr '<=>' expr
| expr '=~' expr
| expr '&&' expr
| expr '||' expr
| expr '##' expr
| '!' expr
_
| expr '&' expr
| expr '|' expr
| expr '#' expr
| '~' expr
_
| expr '<<' expr
| expr '>>' expr
| expr '?' expr ':' expr
;
functioncall
: funcname '(' opt_exprlist ')'
;
array
: '[' ']'
| '[' exprlist ']'
| '[' exprlist ',' ']'
;
object
: '{' opt_keyvaluelist '}'
| NAME '{' opt_keyvaluelist '}'
| NAME '::' NAME '{' opt_keyvaluelist '}'
| NAME '::' NAME '::' NAME '{' opt_keyvaluelist '}'
| NAME '::' NAME '::' NAME '::' NAME '{' opt_keyvaluelist '}'
;
opt_exprlist
: exprlist
| %empty
;
exprlist
: exprlist ',' expr
| expr
;
opt_keyvaluelist
: keyvaluelist
| keyvaluelist ','
| %empty
;
keyvaluelist
: keyvaluelist ',' keyvalue
| keyvalue
;
keyvalue
: key ':' expr
;
key
: STRINGCONSTANT
| NAME
| INTCONSTANT
| REALCONSTANT
| quantity
| '-' INTCONSTANT
| '-' REALCONSTANT
| '-' quantity
| NAN
| INF
| '-' INF
| TRUE
| FALSE
| NULL
| NULLPTR
;
simple_expr
: qname
| operator
| literal
;
funcname
: NAME
| BOOL
| INT
| DOUBLE
| STRING
| OBJECT
| XML
| XMLDOC
;
qname_elem
: NAME
| NAME '[' expr ']'
| THIS
| PARENT
;
qname
: qname '.' qname_elem
| qname_elem
;
operator
: INDEX
| TYPENAME
| qname '.' INDEX
| qname '.' TYPENAME
| EXISTS '(' qname ')'
| SIZEOF '(' qname ')'
;
literal
: stringliteral
| boolliteral
| numliteral
| otherliteral
;
stringliteral
: STRINGCONSTANT
;
boolliteral
: TRUE
| FALSE
;
numliteral
: INTCONSTANT
| realconstant_ext
| quantity
;
otherliteral
: UNDEFINED
| NULLPTR
| NULL
;
quantity
: quantity INTCONSTANT NAME
| quantity realconstant_ext NAME
| INTCONSTANT NAME
| realconstant_ext NAME
;
realconstant_ext
: REALCONSTANT
| INF
| NAN
;
opt_semicolon
: ';'
| %empty
;