Draft Grammar for SDL+

Version 2

The following is a grammar that we (the SAFIRE-SDL team) believe is compatible with the SDL+ draft summary (http://www.sdl-task-force.org/sdl-tf_draftresult_4.pdf). Questions and comments from SDL Task Force members are welcome.


Productions

Root ::=

System_Definition |
Package_Definition

System_Definition ::=

[ Package_Reference_Clause ]
"SYSTEM" Name End
[ Entity_In_System ]
"ENDSYSTEM"
End2

Package_Definition ::=

[ Package_Reference_Clause ]
"PACKAGE" Name End
[ Entity_In_Package ]
"ENDPACKAGE" End2

Package_Reference_Clause ::=

"USE" Name End
[ Package_Reference_Clause ]

Entity_In_System ::=

( Block_Type_Definition |
Process_Type_Definition |
Signal_Definition |
Signal_List_Definition |
Synonym_Definition |
Syntype_Definition |
Procedure_Definition |
Procedure_Definition_Ext |
Channel_Definition |
Typebased_Block_Definition |
Typebased_Process_Definition |
Typebased_Agent_Definition )
[ Entity_In_System ]

Entity_In_Package ::=

( Block_Type_Definition |
Process_Type_Definition |
Signal_Definition |
Signal_List_Definition |
Synonym_Definition |
Syntype_Definition |
Procedure_Definition |
Procedure_Definition_Ext )
[ Entity_In_Package ]

Synonym_Definition ::=

"SYNONYM"
Name
Sort
"="
Expression
End

Signal_Definition ::=

"SIGNAL" Signal_Definition_Item End

Signal_Definition_Item ::=

Name
[ Sort_List ]
[ "," Signal_Definition_Item ]

Sort_List ::=

"(" Sort_List_ ")"

Sort_List_ ::=

Sort
Name
[ "," Sort_List_ ]

Sort ::=

Identifier

Syntype ::=

Identifier

Signal_List_Definition ::=

"SIGNALLIST" Name "=" Signal_List
End

Signal_List ::=

Signal_List_Item
[ "," Signal_List ]

Signal_List_Item ::=

Identifier

Syntype_Definition ::=

"SYNTYPE" Name "=" Sort
"ENDSYNTYPE"
End

Channel_Definition ::=

"CHANNEL" [ "NODELAY" ]
"FROM" F1 "VIA" F1G "TO" T1 "VIA" T1G End
"FROM" F2 "VIA" F2G "TO" T2 "VIA" T2G End2
"ENDCHANNEL"
End3

Entity_In_Block ::=

( Block_Type_Definition |
Process_Type_Definition |
Signal_Definition |
Signal_List_Definition |
Synonym_Definition |
Syntype_Definition |
Procedure_Definition |
Procedure_Definition_Ext |
Channel_Definition |
Typebased_Block_Definition |
Typebased_Process_Definition |
Typebased_Agent_Definition )
[ Entity_In_Block ]

Typebased_Block_Definition ::=

"BLOCK" Name
":" Base_Type
End

Block_Type_Definition ::=

"BLOCK" "TYPE" Block_Body
"ENDBLOCK" "TYPE"
End

Block_Body ::=

Name End
[ Gate_Definition ]
[ Entity_In_Block ]

Typebased_Process_Definition ::=

"PROCESS" Name
":" Base_Type
End

Typebased_Agent_Definition ::=

"AGENT" Name
":" Base_Type
End

Process_Body ::=

Name End
[ Gate_Definition ]
[ Entity_In_Process ]
Defined_Body

Process_Type_Definition ::=

"PROCESS" "TYPE"
Process_Body
"ENDPROCESS" "TYPE"
End

Entity_In_Process ::=

( Signal_Definition |
Signal_List_Definition |
Synonym_Definition |
Syntype_Definition |
Timer_Definition |
Variable_Definition |
Procedure_Definition |
Procedure_Definition_Ext )
[ Entity_In_Process ]

Procedure_Definition ::=

"PROCEDURE" Name End
[ Procedure_Definition_Parameters ]
[ Procedure_Definition_Result ]
Procedure_Body
"ENDPROCEDURE" End2

Procedure_Definition_Parameters ::=

"FPAR" Formal_Parameters End

Procedure_Definition_Result ::=

"RETURNS" Result End

Procedure_Definition_Ext ::=

"PROCEDURE" Name End
[ Procedure_Definition_Parameters ]
[ Procedure_Definition_Result ]
"EXTERNAL" End2

Result ::=

[ Name ]
Sort

Procedure_Body ::=

[ Entity_In_Procedure ]
Defined_Body

Formal_Parameters ::=

[ FPar_In_Out ]
Var_Name_List
Sort
[ "," Formal_Parameters ]

FPar_In_Out ::=

IO |
I

IO ::=

"IN" "/" "OUT"

I ::=

"IN"

Var_Name_List ::=

Name
[ "," Var_Name_List ]

Entity_In_Procedure ::=

( Variable_Definition |
Synonym_Definition |
Syntype_Definition |
Procedure_Definition |
Procedure_Definition_Ext )
[ Entity_In_Procedure ]

Variable_Definition ::=

"DCL" Name_Type
[ Variable_Definition_Init ]
End

Variable_Definition_Init ::=

":="
Expression

Name_Type ::=

Name
Sort

Gate_Definition ::=

"GATE" Name
"IN" "WITH" Gate_Interface_SL1
End
"OUT" "WITH" Gate_Interface_SL2
End2
[ Gate_Definition ]

Gate_Interface_SL ::=

"(" Name ")"

Timer_Definition ::=

"TIMER" Timer_Definition_Item End

Timer_Definition_Item ::=

Name
[ Timer_Auto_Init ]
[ "," Timer_Definition_Item ]

Timer_Auto_Init ::=

":=" Expression

Defined_Body ::=

Start
[ State ]

Start ::=

"START" End2
Transition

State ::=

"STATE"
State_Name End
Input_Part
[ State_End ]
[ State ]

State_End ::=

"ENDSTATE" [ Name ] End

State_Name ::=

"*" |
State_List

State_List ::=

Name
[ "," State_List ]

Input_Part ::=

Basic_Input_Part
[ Input_Part ]

Basic_Input_Part ::=

"INPUT" Input_List End
Transition

Input_List ::=

Input_Stimulus
[ "," Input_List ]

Input_Stimulus ::=

"*" |
Stimulus

Stimulus ::=

Identifier
[ "(" Variable_List ")" ]

Variable_List ::=

[ Variable ]
[ "," Variable_List ]

Nextstate ::=

"NEXTSTATE" Nextstate_Body

Nextstate_Body ::=

Same_State |
Name

Same_State ::=

"-"

Join ::=

"JOIN" Name

Return ::=

"RETURN"
[ Expression ]

Transition ::=

[ Action_Statement ]
Terminator_Statement

Action_Statement ::=

( Labeled_Action |
Action )
End
[ Action_Statement ]

Labeled_Action ::=

Label
Action

Action ::=

Compound_Statement |
TSet |
TReset |
Output |
Procedure_Call |
Decision |
Assignment_Statement

Compound_Statement ::=

[ Comment_Text ] "{"
Transition
"}"

Assignment_Statement ::=

Variable
":="
Expression
[ "," Assignment_Statement ]

Output ::=

"OUTPUT" Output_Body

Output_Body ::=

Identifier
[ Actual_Parameters ]
[ Output_Via ]

Output_Via ::=

"VIA" Gate_Name

Actual_Parameters ::=

"(" Actual_Parameter_Body ")"

Actual_Parameter_Body ::=

Expression
[ "," Actual_Parameter_Body ]

Terminator_Statement ::=

[ Label ]
Terminator End

Terminator ::=

Nextstate |
Join |
Return

Label ::=

Name ":"

TSet ::=

"SET" "(" Set_Statement ")"

Set_Statement ::=

Explicit_Set_Statement |
Implicit_Set_Statement

Explicit_Set_Statement ::=

"NOW" "+" Expression
"," Identifier

Implicit_Set_Statement ::=

Identifier

TReset ::=

"RESET" "(" Reset_Statement ")"

Reset_Statement ::=

Identifier
[ "," Reset_Statement ]

Decision ::=

"DECISION" Expression End
Decision_Body "ENDDECISION"

Decision_Body ::=

( Dec_Answer_Part |
Else_Part )
[ Decision_Body ]

Dec_Answer_Part ::=

"(" Range_Condition ")" ":"
Transition

Else_Part ::=

"ELSE" ":"
Transition

Range_Condition ::=

Range
[ "," Range_Condition ]

Range ::=

Expression

ExtensionMarker ::=

"..."

OpOR ::=

"OR" | "XOR"

OpAND ::=

"AND"

OpREL ::=

"=" | "/=" | ">=" | ">" | "<=" | "<"

OpADD ::=

"+" | "-"

OpMUL ::=

"*" | "/" | "MOD" | "REM"

OpUNA ::=

"-" | "NOT"

Expression ::=

ExprOR

ExprOR ::=

ExprAND [ OpOR ExprOR ]

ExprAND ::=

ExprREL [ OpAND ExprAND ]

ExprREL ::=

ExprADDL [ OpREL ExprADDR ]

ExprADD ::=

ExprMUL [ OpADD ExprADD ]

ExprMUL ::=

ExprUNA [ OpMUL ExprMUL ]

ExprUNA ::=

[ OpUNA ] Primary

Primary ::=

Procedure_Call |
Variable |
ExprBrace |
Num |
Str |
BitStr

Variable ::=

Identifier
[ Variable_Field ]

Variable_Field ::=

"." Identifier

ExprBrace ::=

"(" ExprOR ")"

Procedure_Call ::=

"CALL" Identifier
[ Actual_Parameters ]

End ::=

[ Comment ] ";"

Comment ::=

"COMMENT" Comment_Text