ГОСТ Р МЭК 61131-3-2016. Национальный стандарт Российской Федерации. Контроллеры программируемые. Часть 3. Языки программирования
Приложение A
(обязательное)
ФОРМАЛЬНАЯ СПЕЦИФИКАЦИЯ ЭЛЕМЕНТОВ ЯЗЫКА
Синтаксис текстовых языков определен в варианте "расширенной БНФ" (Бэкус-Науровой формы).
Синтаксис этого варианта РБНФ следующий:
Для целей настоящего приложения A, терминальные текстовые символы состоят из соответствующей строки символов, заключенной в парные одиночные кавычки. Например, терминальный символ, представляемый строкой символов ABC, представлен посредством 'ABC'.
Нетерминальные текстовые символы должны быть представлены строками букв нижнего регистра, числами и символом подчеркивания "_", начиная с буквы верхнего регистра.
Продукционные правила
Правила вывода для текстовых языков имеют форму
non_terminal_symbol : extended_structure;
Данное правило можно прочитать как: "non_terminal_symbol может включать extended_structure".
Расширенные структуры можно конструировать в соответствии со следующими правилами:
любой терминальный символ - расширенная структура;
любой нетерминальный символ - расширенная структура.
Если S - расширенная структура, то следующие выражения также являются расширенными структурами:
(S) - означает собственно S;
(S)* - замыкание, означающее нуль или большее число конкатенаций S;
(S)+ - замыкание, означающее одно или большее число сцеплений S;
(S)? - вариант, означающий нуль или одно появление S.
Если S1 и S2 - это расширенные структуры, тогда следующие выражения являются расширенными структурами:
S1 | S2 - изменение, означающее выбор S1 или S2;
S1 S2 - сцепление, означающее S1, за которым следует S2;
Сцепление предшествует изменению, то есть
S1 | S2 S3 - эквивалентно S1 | (S2 S3), S1 S2 | S3 - эквивалентно (S1 S2) | S3.
Если S - это расширенная структура, которая обозначает одиночный символ или изменение одиночных символов, тогда следующее также является расширенной структурой:
~(S) - отрицание, означающее любой одиночный символ, который не находится в S. Отрицание предшествует замыканию или опции, то есть
~(S)* - эквивалентно (~(S))*.
Следующие символы используются для обозначения определенных символов или классов символов:
. - любой одиночный символ;
\' - символ одиночной кавычки;
\n - новая строка;
\r - возврат каретки;
\t - табулятор.
Комментарии в грамматике начинаются двойной косой чертой и заканчиваются в конце строки:
// Это комментарий
// Таблица 1 - Наборы символов // Таблица 2 - Идентификаторы | ||
Буква | : 'A'..'Z' | '_'; | |
Цифра | : '0'..'9'; | |
Бит | : '0'..'1'; | |
Octal_Digit | : '0'..'7'; | |
Hex_Digit | : '0'..'9' | 'A'..'F'; | |
Идентификатор | : Буква ( Буква | Цифра)*; | |
// Таблица 3 - Комментарии | ||
Комментарий | : '//' ~( '\n' | '\r' )* '\r' ? '\n' {$channel=HIDDEN;} | '(*' ( options{greedy=false;}: . )* '*)' {$channel=HIDDEN;} | '/*' ( options{greedy=false;}: . )* '*/' {$channel=HIDDEN;}; | |
WS | : ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;}; // пробел | |
EOL | : '\n'; | |
// Таблица 4 - Прагма | ||
Прагма | : '{' ( options{greedy=false;}: . )* '}' {$channel=HIIDDEN;}; | |
// Таблица 5 - Числовые литералы | ||
Константа | : Numeric_Literal | Char_Literal | Time_Literal | Bit_Str_Literal | Bool_Literal; | |
Numeric_Literal | : Int_Literal | Real_Literal; | |
Int_Literal | : ( Int_Type_Name '#' )? ( Signed_Int | Binary_Int | Octal_Int | Hex_Int ); | |
Unsigned_Int | : Digit ( '_' ? Digit )*; | |
Signed_Int | : ( '+' | '-' )? Unsigned_Int; | |
Binary_Int | : '2#' ( '_' ? Bit )+; | |
Octal_Int | : '8#' ( '_' ? Octal_Digit )+; | |
Hex_Int | : '16#' ( '_' ? Hex_Digit )+; | |
Real_Literal | : ( Real_Type_Name '#' )? Signed_Int '.' Unsigned_Int ( 'E' Signed_Int )?; | |
Bit_Str_Literal | : ( Multibits_Type_Name '#' )? ( Unsigned_Int | Binary_Int | Octal_Int | Hex_Int ); | |
Bool_Literal | : ( Bool_Type_Name '#' )? ( '0' | '1' | 'FALSE' | 'TRUE' ); | |
// Таблица 6 - Символьно-строковые литералы // Таблица 7 - Двухсимвольные комбинации в символьных строках | ||
Char_Literal | : ( 'STRING#' )? Char_Str; | |
Char_Str | : S_Byte_Char_Str | D_Byte_Char_Str; | |
S_Byte_Char_Str | : '\" S_Byte_Char_Value + '\"; | |
D_Byte_Char_Str | : | |
S_Byte_Char_Value | : Common_Char_Value | '$\" | | |
D_Byte_Char_Value | : Common_Char_Value | '\'' | '$ | |
Common_Char_Valu | : ' ' | '!' | '#' | '%' | '&' | '('..'/' | '0'..'9' | ':'..'@' | 'A'..'Z' | '['.. | |
|
| // любой печатаемый символ, за исключением $, 'and' |
// Таблица 8 - Литералы длительности // Таблица 9 - Литералы даты и времени суток | ||
Time_Literal | : Duration | Time_Of_Day | Date | Date_And_Time; | |
Длительность | : ( Time_Type_Name | 'T' | 'LT' ) '#' ( '+' | '-' )? Интервал; | |
Fix_Point | : Unsigned_Int ( '.' Unsigned_Int )?; | |
Интервал | : Сутки | Часы | Минуты | Секунды | Миллисекунды | Микросекунды | Наносекунды; | |
Сутки | : ( Fix_Point 'd' ) | ( Unsigned_Int 'd' '_' ? )? Часы?; | |
Часы | : ( Fix_Point 'h' ) | ( Unsigned_Int 'h' '_' ? )? Минуты?; | |
Минуты | : ( Fix_Point 'm' ) | ( Unsigned_Int 'm' '_' ? )? Секунды?; | |
Секунды | : ( Fix_Point 's' ) | ( Unsigned_Int 's' '_' ? )? Миллисекунды?; | |
Миллисекунды | : ( Fix_Point 'ms' ) | ( Unsigned_Int 'ms' '_' ? )? Микросекунды?; | |
Микросекунды | : ( Fix_Point 'us' ) | ( Unsigned_Int 'us' '_' ? )? Наносекунды?; | |
Наносекунды | : Fix_Point 'ns'; | |
Time_Of_Day | : ( Tod_Type_Name | 'LTIME_OF_DAY' ) '#' Daytime; | |
Daytime | : Day_Hour ':' Day_Minute ':' Day_Second; | |
Day_Hour | : Unsigned_Int; | |
Day_Minute | : Unsigned_Int; | |
Day_Second | : Fix_Point; | |
Дата | : ( Date_Type_Name | 'D' | 'LD') '#' Date_Literal; | |
Date_Literal | : Год '-' Месяц '-' День; | |
Год | : Unsigned_Int; | |
Месяц | : Unsigned_Int; | |
День | : Unsigned_Int; | |
Date_And_Time | : ( DT_Type_Name | 'LDATE_AND_TIME' ) '#' Date_Literal '-' Daytime; | |
// Таблица 10 - Элементарные типы данных | ||
Data_Type_Access | : Elem_Type_Name | Derived_Type_Access; | |
Elem_Type_Name | : Numeric_Type_Name | Bit_Str_Type_Name | String_Type_Name | Date_Type_Name | Time_Type_Name; | |
Numeric_Type_Name | : Int_Type_Name | Real_Type_Name; | |
Int_Type_Name | : Sign_Int_Type_Name | Unsign_Int_Type_Name; | |
Sign_Int_Type_Name | : 'SINT' | 'INT' | 'DINT' | 'LINT'; | |
Unsign_Int_Type_Name | : 'USINT' | 'UINT' | 'UDINT' | 'ULINT'; | |
Real_Type_Name | : 'REAL' | 'LREAL'; | |
String_Type_Name | : 'STRING' ( '[' Unsigned_Int ']' )? | 'WSTRING' ( '[' Unsigned_Int ']' )? | 'CHAR' | 'WCHAR'; | |
Time_Type_Name | : 'TIME' | 'LTIME'; | |
Date_Type_Name | : 'DATE' | 'LDATE'; | |
Tod_Type_Name | : 'TIME_OF_DAY' | 'TOD' | 'LTOD'; | |
DT_Type_Name | : 'DATE_AND_TIME' | 'DT' | 'LDT'; | |
Bit_Str_Type_Name | : Bool_Type_Name | Multibits_Type_Name; | |
Bool_Type_Name | : 'BOOL'; | |
Multibits_Type_Name | : 'BYTE' | 'WORD' | 'DWORD' | 'LWORD'; | |
// Таблица 11 - Объявление определяемых пользователем типов данных и инициализации | ||
Derived_Type_Access | : Single_Elem_Type_Access | Array_Type_Access | Struct_Type_Access | String_Type_Access | Class_Type_Access | Ref_Type_Access | Interface_Type_Access; | |
String_Type_Access | : ( Namespace_Name '.' )* String_Type_Name; | |
Single_Elem_Type_Access | : Simple_Type_Access | Subrange_Type_Access | Enum_Type_Access; | |
Simple_Type_Access | : ( Namespace_Name '.' )* Simple_Type_Name; | |
Subrange_Type_Access | : ( Namespace_Name '.' )* Subrange_Type_Name; | |
Enum_Type_Access | : ( Namespace_Name '.' )* Enum_Type_Name; | |
Array_Type_Access | : ( Namespace_Name '.' )* Array_Type_Name; | |
Struct_Type_Access | : ( Namespace_Name '.' )* Struct_Type_Name; | |
Simple_Type_Name | : Идентификатор; | |
Subrange_Type_Name | : Идентификатор; | |
Enum_Type_Name | : Идентификатор; | |
Array_Type_Name | : Идентификатор; | |
Struct_Type_Name | : Идентификатор; | |
Data_Type_Decl | : 'TYPE' ( Type_Decl ';' )+ 'END_TYPE'; | |
Type_Decl | : Simple_Type_Decl | Subrange_Type_Decl | Enum_Type_Decl | Array_Type_Decl | Struct_Type_Decl | Str_Type_Decl | Ref_Type_Decl; | |
Simple_Type_Decl | : Simple_Type_Name ':' Simple_Spec_Init; | |
Simple_Spec_Init | : Simple_Spec ( ':=' Constant_Expr )?; | |
Simple_Spec | : Elem_Type_Name | Simple_Type_Access; | |
Subrange_Type_Decl | : Subrange_Type_Name ':' Subrange_Spec_Init; | |
Subrange_Spec_Init | : Subrange_Spec '(' ':=' Signed_Int )?; | |
Subrange_Spec | : Int_Type_Name '(' Subrange ')' | Subrange_Type_Access; | |
Subrange | : Constant_Expr '..' Constant_Expr; | |
Enum_Type_Decl | : Enum_Type_Name ':' ( ( Elem_Type_Name ? Named_Spec_Init ) | Enum_Spec_Init ); | |
Named_Spec_Init | : '(' Enum_Value_Spec ( ',' Enum_Value_Spec )* ')' ( ':=' Enum_Value )?; | |
Enum_Spec_Init | : ( ( '(' Identifier ( ',' Identifier )* ')' ) | Enum_Type_Access ) ( ':=' Enum_Value )?; | |
Enum_Value_Spec | : Identifier ( ':=' ( Int_Literal | Constant_Expr ) )?; | |
Enum_Value | : ( Enum_Type_Name '#' )? Identifier; | |
Array_Type_Decl | : Array_Type_Name ':' Array_Spec_Init; | |
Array_Spec_Init | : Array_Spec ( ':=' Array_Init )?; | |
Array_Spec | : Array_Type_Access | 'ARRAY' '[' Subrange ( ',' Subrange )* ']' 'OF' Data_Type_Access; | |
Array_Init | : '[' Array_Elem_Init ( ',' Array_Elem_Init )* ']'; | |
Array_Elem_Init | : Array_Elem_Init_Value | Unsigned_Int '(' Array_Elem_Init_Value ? ')'; | |
Array_Elem_Init_Value | : Constant_Expr | Enum_Value | Struct_Init | Array_Init; | |
Struct_Type_Decl | : Struct_Type_Name ':' Struct_Spec; | |
Struct_Spec | : Struct_Decl | Struct_Spec_Init; | |
Struct_Spec_Init | : Struct_Type_Access ( ':=' Struct_Init )?; | |
Struct_Decl | : 'STRUCT' 'OVERLAP' ? ( Struct_Elem_Decl ';' )+ 'END_STRUCT'; | |
Struct_Elem_Decl | : Struct_Elem_Name ( Located_At Multibit_Part_Access ? )? ':' ( Simple_Spec_Init | Subrange_Spec_Init | Enum_Spec_Init | Array_Spec_Init | Struct_Spec_Init ); | |
Struct_Elem_Name | : Identifier; | |
Struct_Init | : '(' Struct_Elem_Init ( ',' Struct_Elem_Init )* ')'; | |
Struct_Elem_Init | : Struct_Elem_Name ':=' ( Constant_Expr | Enum_Value | Array_Init | Struct_Init | Ref_Value ); | |
Str_Type_Decl | : String_Type_Name ':' String_Type_Name ( ':=' Char_Str )?; | |
// Таблица 16 - Прямо представленные переменные | ||
Direct_Variable | : '%' ( 'I' | 'Q' | 'M' ) ( 'X' | 'B' | 'W' | 'D' | 'L' )? Unsigned_Int ( '.' Unsigned_Int )*; | |
// Таблица 12 - Операции со ссылками | ||
Ref_Type_Decl | : Ref_Type_Name ':' Ref_Spec_Init; | |
Ref_Spec_Init | : Ref_Spec ( '; =' Ref_Value )?; | |
Ref_Spec | : 'REF_TO' + Data_Type_Access; | |
Ref_Type_Name | : Идентификатор; | |
Ref_Type_Access | : ( Namespace_Name '.' )* Ref_Type_Name; | |
Ref_Name | : Идентификатор; | |
Ref_Value | : Ref_Addr | 'NULL'; | |
Ref_Addr | : 'REF' '(' ( Symbolic_Variable | FB_Instance_Name | Class_Instance_Name ) ')'; Ref_Assign | |
Ref_Name ' | : =' ( Ref_Name | Ref_Deref | Ref_Value ); | |
Ref_Deref | : Ref_Name | |
// Таблица 13 - Объявление переменных/Таблица 14 - Инициализация переменных | ||
Переменная | : Direct_Variable | Symbolic_Variable; | |
Symbolic_Variable | : ( ( 'THIS' '.' ) | ( Namespace_Name '.' )+ )? ( Var_Access | Multi_Elem_Var ); | |
Var_Access | : Variable_Name | Ref_Deref; | |
Variable_Name | : Идентификатор; | |
Multi_Elem_Var | : Var_Access ( Subscript_List | Struct_Variable )+; | |
Subscript_List | : '[' Subscript ( ',' Subscript )* ']'; | |
Индекс | : Выражение; | |
Struct_Variable | : '.' Struct_Elem_Select; | |
Struct_EIem_Select | : Var_Access; | |
Input_Decls | : 'VAR_INPUT' ( 'RETAIN' | 'NON_RETAIN' )? ( Input_Decl ';' )* 'END_VAR'; | |
Input_Decl | : Var_Decl_Init | Edge_Decl | Array_Conform_Decl; | |
Edge_Decl | : Variable_List ':' 'BOOL' ( 'R_EDGE' | 'F_EDGE' ); | |
Var_Decl_Init | : Variable_List ':' ( Simple_Spec_Init | Str_Var_Decl | Ref_Spec_Init ) | Array_Var_Decl_Init | Struct_Var_Decl_Init | FB_Decl_Init | Interface_Spec_Init; | |
Ref_Var_Decl | : Variable_List ':' Ref_Spec; | |
Interface_Var_Decl | : Variable_List ':' Interface_Type_Access; | |
Variable_List | : Variable_Name ( ',' Variable_Name )*; | |
Array_Var_Decl_Init | : Variable_List ':' Array_Spec_Init; | |
Array_Conformand | : 'ARRAY' '[' '*' ( ',' '*' :)* ']' 'OF' Data_Type_Access; | |
Array_Conform_Decl | : Variable_List ':' Array_Conformand; | |
Struct_Var_Decl_Init | : Variable_List ':' Struct_Spec_Init; | |
FB_Decl_No_Ini | : FB_Name ( ',' FB_Name )* ':' FB_Type_Access; | |
FB_Decl_Init | : FB_Decl_No_Init ( ':=' Struct_Init )?; | |
FB_Name | : Идентификатор; | |
FB_Instance_Name | : ( Namespace_Name '.' )* FB_Name | |
Output_Decls | : 'VAR_OUTPUT' ( 'RETAIN' | 'NON_RETAIN' )? ( Output_Decl ';' )* 'END_VAR'; | |
Output_Decl | : Var_Decl_Init | Array_Conform_Decl; | |
In_Out_Decls | : 'VAR_IN_OUT' ( In_Out_Var_Decl ';' )* 'END_VAR'; | |
In_Out_Var_Decl | : Var_Decl | Array_Conform_Decl | FB_Decl_No_Init; | |
Var_Decl | : Variable_List ':' ( Simple_Spec | Str_Var_Decl | Array_Var_Decl | Struct_Var_Decl ); | |
Array_Var_Decl | : Variable_List ':' Array_Spec; | |
Struct_Var_Decl | : Variable_List ':' Struct_Type_Access; | |
Var_Decls | : 'VAR' 'CONSTANT' ? Access_Spec ? ( Var_Decl_Init ';' )* 'END_VAR'; | |
Retain_Var_Decls | : 'VAR' 'RETAIN' Access_Spec ? ( Var_Decl_Init ';')* 'END_VAR'; | |
Loc_Var_Decls | : 'VAR' ( 'CONSTANT' | 'RETAIN' | 'NON_RETAIN' )? ( Loc_Var_Decl ';' )* 'END_VAR'; | |
Loc_Var_Decl | : Variable_Name ? Located_At ':' Loc_Var_Spec_Init; | |
Temp_Var_Decls | : 'VAR_TEMP' ( ( Var_Decl | Ref_Var_Decl | Interface_Var_Decl ) ';' )* 'END_VAR'; | |
External_Var_Decls | : 'VAR_EXTERNAL' 'CONSTANT' ? ( External_Decl ':' )* 'END_VAR'; | |
External_Decl | : Global_Var_Name ':' ( Simple_Spec | Array_Spec | Struct_Type_Access | FB_Type_Access | Ref_Type_Access ); | |
Global_Var_Name | : Идентификатор; | |
Global_Var_Decls | : VAR_GLOBAL' ( 'CONSTANT' | 'RETAIN' )? ( Global_Var_Decl ';' )* 'END_VAR'; | |
Global_Var_Decl | : Global_Var_Spec ':' ( Loc_Var_Spec_Init | FB_Type_Access ); | |
Global_Var_Spec | : ( Global_Var_Name ( ',' Global_Var_Name )* ) | ( Global_Var_Name Located_At ); | |
Loc_Var_Spec_Init | : Simple_Spec_Init | Array_Spec_Init | Struct_Spec_Init | S_Byte_Str_Spec | D_Byte_Str_Spec; | |
Located_At | : AT' Direct_Variable; | |
Str_Var_Decl | : S_Byte_Str_Var_Decl | D_Byte_Str_Var_Decl; | |
S_Byte_Str_Var_Decl | : Variable_List ':' S_Byte_Str_Spec; | |
S_Byte_Str_Spec | : 'STRING' ( '[' Unsigned_Int ']' )? ( ': =' S_Byte_Char_Str )?; | |
D_Byte_Str_Var_Decl | : Variable_List ':' D_Byte_Str_Spec; | |
D_Byte_Str_Spec | : 'WSTRING' ( '[' Unsigned_Int ']' )? ( ':=' D_Byte_Char_Str )?; | |
Loc_Partly_Var_Decl | : 'VAR' ( 'RETAIN' | 'NON_RETAIN' )? Loc_Partly_Var * 'END_VAR'; | |
Loc_Partly_Var | : Variable_Name 'AT' '%' ( 'I' | 'Q' | 'M' ) '*' ':' Var_Spec ';'; | |
Var_Spec | : Simple_Spec | Array_Spec | Struct_Type_Access | ( 'STRING' | 'WSTRING' ) ( '[' Unsigned_Int ']' )?; | |
// Таблица 19 - Объявление функции | ||
Func_Name | : Std_Func_Name | Derived_Func_Name; | |
Func_Access | : ( Namespace_Name '.' )* Func_Name; | |
Std_Func_Name ' | : 'TRUNC' | 'ABS' | 'SQRT' | 'LN' | 'LOG' | 'EXP' | 'SIN' | 'COS' | 'TAN' | 'ASIN' | 'ACOS' | 'ATAN' | 'ATAN2 | 'ADD' | 'SUB' | 'MUL' | 'DIV' | 'MOD' | 'EXPT' | 'MOVE' | 'SHL' | 'SHR' | 'ROL' | 'ROR' | 'AND' | 'OR' | 'XOR' | 'NOT' | 'SEL' | 'MAX' | 'MIN' | 'LIMIT' | 'MUX' | 'GT' | 'GE' | 'EQ' | 'LE' | 'LT' | 'NE' | 'LEN' | 'LEFT' | 'RIGHT' | 'MID' | 'CONCAT' | 'INSERT' | 'DELETE' | 'REPLACE' | 'FIND'; | |
| // неполный перечень | |
Derived_Func_Name | : Идентификатор; | |
Func_Decl | : 'FUNCTION' Derived_Func_Name ( ':' Data_Type_Access )? Using_Directive * ( IO_Var_Decls | Func_Var_Decls | Temp_Var_Decls )* Func_Body 'END_FUNCTION'; | |
IO_Var_Decls | : Input_Decls | Output_Decls | In_Out_Decls; | |
Func_Var_Decls | : External_Var_Decls | Var_Decls; | |
Func_Body | : Ladder_Diagram | FB_Diagram | Instruction_List | Stmt_List | Other_Languages; | |
//Таблица 40 - Объявление типа функционального блока //Таблица 41 - Объявление экземпляра функционального блока | ||
FB_Type_Name | : Std_FB_Name | Derived_FB_Name; | |
FB_Type_Access | : ( Namespace_Name '.' )* FB_Type_Name; | |
Std_FB_Name | : 'SR' | 'RS' | 'R_TRIG' | 'F_TRIG' | 'CTU'| 'CTD' | 'CTUD' | 'TP' | 'TON' | 'TOF'; | |
| // неполный перечень | |
Derived_FB_Name | : Идентификатор; | |
FB_Decl | : 'FUNCTION_BLOCK' ( 'FINAL' | 'ABSTRACT' )? Derived_FB_Name Using_Directive * ( 'EXTENDS' ( FB_Type_Access | Class_Type_Access ) )? ( 'IMPLEMENTS' Interface_Name_List )? ( FB_IO_Var_Decls | Func_Var_Decls | Temp_Var_Decls | Other_Var_Decls )* ( Method_Decl )* FB_Body ? 'END_FUNCTION_BLOCK'; | |
FB_IO_Var_Decls | : FB_Input_Decls | FB_Output_Decls | In_Out_Decls; | |
FB_Input_Decls | : 'VAR_INPUT' ( 'RETAIN' | 'NON_RETAIN' )? ( FB_Input_Decl ';' )* 'END_VAR'; | |
FB_Input_Decl | : Var_Decl_Init | Edge_Decl | Array_Conform_Decl; | |
FB_Output_Decls | : 'VAR_OUTPUT' ( 'RETAIN' | 'NON_RETAIN' )? ( FB_Output_Decl ';' )* 'END_VAR'; | |
FB_Output_Decl | : Var_Decl_Init | Array_Conform_Decl; | |
Other_Var_Decls | : Retain_Var_Decls | No_Retain_Var_Decls | Loc_Partly_Var_Decl; | |
No_Retain_Var_Decls | : 'VAR' 'NON_RETAIN' Access_Spec ? ( Var_Decl_Init ';' )* 'END_VAR'; | |
FB_Body | : SFC | Ladder_Diagram | FB_Diagram | Instruction_List | Stmt_List | Other_Languages; | |
Method_Decl | : 'METHOD' Access_Spec ( 'FINAL' | 'ABSTRACT' )? 'OVERRIDE' ? Method_Name ( ':' Data_Type_Access )? ( IO_Var_Decls | Func_Var_Decls | Temp_Var_Decls )* Func_Body 'END_METHOD'; | |
Method_Name | : Идентификатор; | |
//Таблица 48 - Класс //Таблица 50 - Текстовый вызов методов - Формальный и неформальный перечень параметров | ||
Class_Decl | : 'CLASS' ( 'FINAL' | 'ABSTRACT' )? Class_Type_Name Using_Directive * ( 'EXTENDS' Class_Type_Access )? ( 'IMPLEMENTS' Interface_Name_List )? ( Func_Var_Decls | Other_Var_Decls )* ( Method_Decl )* 'END_CLASS'; | |
Class_Type_Name | : Идентификатор; | |
Class_Type_Access | : ( Namespace_Name '.' )* Class_Type_Name; | |
Class_Name | : Идентификатор; | |
Class_Instance_Name | : ( Namespace_Name '.' )* Class_Name | |
Interface_Decl | : 'INTERFACE' Interface_Type_Name Using_Directive * ( 'EXTENDS' Interface_Name_List )? Method_Prototype * 'END_INTERFACE'; | |
Method_Prototype | : 'METHOD' Method_Name ( ':' Data_Type_Access )? IO_Var_Decls * 'END_METHOD'; | |
Interface_Spec_Init | : Variable_List ( ':=' Interface_Value )?; | |
Interface_Value | : Symbolic_Variable | FB_Instance_Name | Class_Instance_Name | 'NULL'; | |
Interface_Name_List | : Interface_Type_Access ( ',' Interface_Type_Access )*; | |
Interface_Type_Name | : Идентификатор; | |
Interface_Type_Access | : ( Namespace_Name '.' )* Interface_Type_Name; | |
Interface_Name | : Идентификатор; | |
Access_Spec | : 'PUBLIC' | 'PROTECTED' | 'PRIVATE' | 'INTERNAL'; | |
// Таблица 47 - Объявление программы | ||
Prog_Decl | : 'PROGRAM' Prog_Type_Name ( IO_Var_Decls | Func_Var_Decls | Temp_Var_Decls | Other_Var_Decls | Loc_Var_Decls | Prog_Access_Decls )* FB_Body 'END_PROGRAM'; | |
Prog_Type_Name | : Идентификатор; | |
Prog_Type_Access | : ( Namespace_Name '.' )* Prog_Type_Name; | |
Prog_Access_Decls | : 'VAR_ACCESS' ( Prog_Access_Decl ';' )* 'END_VAR'; | |
Prog_Access_Decl | : Access_Name ':' Symbolic_Variable Multibit_Part_Access ? ':' Data_Type_Access Access_Direction ?; | |
// Таблица 54 - 61 Последовательная функциональная схема (SFC) | ||
SFC | : Sfc_Network +; | |
Sfc_Network | : Initial_Step ( Step | Transition | Action )*; | |
Initial_Step | : 'INITIAL_STEP' Step_Name ':' ( Action_Association ';' )* 'END_STEP'; | |
Step | : 'STEP' Step_Name ':' ( Action_Association ';' )* 'END_STEP'; | |
Step_Name | : Идентификатор; | |
Action_Qualifier | : 'N' | 'R' | 'S' | 'P' | ( ( 'L' | 'D' | 'SD' | 'DS' | 'SL' ) ',' Action_Time ); | |
Action_Time | : Duration | Variable_Name; | |
Indicator_Name | : Variable_Name; | |
Переход | : 'TRANSITION' Transition_Name ? ( '(' 'PRIORITY' ':=' Unsigned_Int ')' )? 'FROM' Steps 'TO' Steps ':' Transition_Cond 'END_TRANSITION'; | |
Transition_Name | : Идентификатор; | |
Шаги | : Step_Name | '(' Step_Name ( ',' Step_Name )+ ')'; | |
Transition_Cond | : ':=' Expression ';' | ':' ( FBD_Network | LD_Rung ) | ':=' IL_Simple_Inst; | |
Action | : 'ACTION' Action_Name ':' FB_Body 'END_ACTION'; | |
// Таблица 62 - Конфигурация и определение ресурса | ||
Config_Name | : Идентификатор; | |
Resource_Type_Name | : Идентификатор; | |
Config_Decl | : 'CONFIGURATION' Config_Name Global_Var_Decls ? ( Single_Resource_Decl | Resource_Decl + ) Access_Decls ? Config_Init ? : 'END_CONFIGURATION'; | |
Resource_Decl | : 'RESOURCE' Resource_Name 'ON' Resource_Type_Name Global_Var_Decls ? Single_Resource_Decl 'END_RESOURCE'; | |
Single_Resource_Decl | : ( Task_Config ';' )* ( Prog_Config ';' )+; | |
Resource_Name | : Идентификатор; | |
Access_Decls | : 'VAR_ACCESS' ( Access_Decl ';' )* 'END_VAR'; | |
Access_Decl | : Access_Name ':' Access_Path ':' Data_Type_Access Access_Direction ?; | |
Access_Path | : ( Resource_Name '.' )? Direct_Variable | ( Resource_Name '.' )? ( Prog_Name '.' )? ( ( FB_Instance_Name | Class_Instance_Name ) '.' )* Symbolic_Variable; | |
Global_Var_Access | : ( Resource_Name '.' )? Global_Var_Name ( '.' Struct_Elem_Name )?; | |
Access_Name | : Identifier; | |
Prog_Output_Access | : Prog_Name '.' Symbolic_Variable; | |
Prog_Name | : Identifier; | |
Access_Direction | : 'READ_WRITE' | 'READ_ONLY'; | |
Task_Config | : 'TASK' Task_Name Task_Init; | |
Task_Name | : Identifier; | |
Task_Init | : '(' ( 'SINGLE' ':=' Data_Source ',' )? | |
| ( 'INTERVAL':'=' Data_Source ',')? 'PRIORITY' ':=' Unsigned_Int ')'; | |
Data_Source | : Constant | Global_Var_Access | Prog_Output_Access | Direct_Variable; | |
Prog_Config | : 'PROGRAM' ( 'RETAIN' | 'NON_RETAIN' )? Prog_Name ( 'WITH' Task_Name )? ':' Prog_Type_Access ( '(' Prog_Conf_Elems ')' )?; | |
Prog_Conf_Elems | : Prog_Conf_Elem ( ',' Prog_Conf_Elem )*; | |
Prog_Conf_Elem | : FB_Task | Prog_Cnxn; | |
FB_Task | : FB_Instance_Name 'WITH' Task_Name; | |
Prog_Cnxn | : Symbolic_Variable ':=' Prog_Data_Source | Symbolic_Variable '=>' Data_Sink; | |
Prog_Data_Source | : Constant | Enum_Value | Global_Var_Access | Direct_Variable; | |
Data_Sink | : Global_Var_Access | Direct_Variable; | |
Config_Init | : 'VAR_CONFIG' ( Config_Inst_Init ';' )* 'END_VAR'; | |
Config_Inst_Init | : Resource_Name '.' Prog_Name '.' ( ( FB_Instance_Name | Class_Instance_Name ) '.' )* ( Variable_Name Located_At ? ':' Loc_Var_Spec_Init | ( ( FB_Instance_Name ':' FB_Type_Access ) | ( Class_Instance_Name ':' Class_Type_Access ) ) ':=' Struct_Init); | |
// Таблица 64 - Пространство имен | ||
Namespace_Decl | : 'NAMESPACE' 'INTERNAL' ? Namespace_H_Name Using_Directive * Namespace_Elements 'END_NAMESPACE'; | |
Namespace_Elements | : ( Data_Type_Decl | Func_Decl | FB_Decl | Class_Decl | Interface_Decl | Namespace_Decl )+; | |
Namespace_H_Name | : Namespace_Name ( '.' Namespace_Name )*; | |
Namespace_Name | : Идентификатор; | |
Using_Directive | : 'USING' Namespace_H_Name ( ',' Namespace_H_Name )* ';'; | |
POU_Decl | : Using_Directive * ( Global_Var_Decls | Data_Type_Decl | Access_Decls | Func_Decl | FB_Decl | Class_Decl | Interface_Decl | Namespace_Decl )+; | |
// Таблица 67 - 70 Перечень инструкций (IL) | ||
Instruction_List | : IL_Instruction +; | |
IL_Instruction | : ( IL_Label ':' )? ( IL_Simple_Operation | IL_Expr | IL_Jump_Operation | IL_Invocation | IL_Formal_Func_Call | IL_Return_Operator )? EOL +; | |
IL_Simple_Inst | IL_Simple_Operation | IL_Expr | IL_Formal_Func_Call; | |
IL_Label | : Идентификатор; | |
IL_Simple_Operation | : IL_Simple_Operator IL_Operand ? | Func_Access IL_Operand_List ?; | |
IL_Expr | : IL_Expr_Operator '(' IL_Operand ? EOL + IL_Simple_Inst_List ? ')'; | |
IL_Jump_Operation | : IL_Jump_Operator IL_Label; | |
IL_Invocation | : IL_Call_Operator ((( FB_Instance_Name | Func_Name | Method_Name | 'THIS' | ( ( 'THIS' '.' ( ( FB_Instance_Name | Class_Instance_Name ) '.' )* ) Method_Name ) ) ( '(' ( ( EOL + IL_Param_List ? ) | IL_Operand_List ? ) ')' )? ) | 'SUPER' '(' ')' ); | |
IL_Formal_Func_Call | : Func_Access '(' EOL + IL_Param_List ? ')'; | |
IL_Operand | : Constant | Enum_Value | Variable_Access; | |
IL_Operand_List | : IL_Operand ( ',' IL_Operand )*; | |
IL_Simple_Inst_List | : IL_Simple_Instruction +; | |
IL_Simple_Instruction | : ( IL_Simple_Operation | IL_Expr | IL_Formal_Func_Call ) EOL +; | |
IL_Param_List | : IL_Param_Inst * IL_Param_Last_Inst; | |
IL_Param_Inst | : ( IL_Param_Assign | IL_Param_Out_Assign ) ',' EOL +; | |
IL_Param_Last_Inst | : ( IL_Param_Assign | IL_Param_Out_Assign ) EOL +; | |
IL_Param_Assign | : IL_Assignment ( IL_Operand | ( '(' EOL + IL_Simple_Inst_List ')' ) ); | |
IL_Param_Out_Assign | : IL_Assign_Out_Operator Variable_Access; | |
IL_Simple_Operator | : 'LD' | 'LDN' | 'ST' | 'STN' | 'ST?' | 'NOT' | 'S' | 'R' | 'S1' | 'R1' | 'CLK' | 'CU' | 'CD' | 'PV' | 'IN' | 'PT' | IL_Expr_Operator; | |
IL_Expr_Operator | : 'AND' | '&' | 'OR' | 'XOR' | 'ANDN' | '&N' | 'ORN' | 'XORN' | 'ADD' | 'SUB' | 'MUL' | 'DIV' | 'MOD' | 'GT' | 'GE' | 'EQ' | 'LT' | 'LE' | 'NE'; | |
IL_Assignment | : Variable_Name ':='; | |
IL_Assign_Out_Operator | : 'NOT' ? Variable_Name '=>'; | |
IL_Call_Operator | : 'CAL' | 'CALC' | 'CALCN'; | |
IL_Return_Operator | : 'RT' | 'RETC' | 'RETCN'; | |
IL_Jump_Operator | : 'JMP' | 'JMPC' | 'JMPCN'; | |
//Таблица 71 - 72 Язык структурированного текста | ||
Expression | : Xor_Expr ( 'OR' Xor_Expr )*; | |
Constant_Expr | : Выражение; | |
//константное выражение за время компиляции должно оценивать до постоянного значения | ||
Xor_Expr | : And_Expr ( 'XOR' And_Expr )*; | |
And_Expr | : Compare_Expr ( ( '&' | 'AND' ) Compare_Expr )*; | |
Compare_Expr | : ( Equ_Expr ( ( '=' | '<>' ) Equ_Expr )* ); | |
Equ_Expr | : Add_Expr ( ( '<' | '>' | '<=' | '>=' ) Add_Expr )*; | |
Add_Expr | : Term ( ( '+' | '-' ) Term )*; | |
Term | : Power_Expr ( '*' | '/' | 'MOD' Power_Expr )*; | |
Power_Expr | : Unary_Expr ( '**' Unary_Expr )*; | |
Unary_Expr | : '-' | '+' | 'NOT' ? Primary_Expr; | |
Primary_Expr | : Constant | Enum_Value | Variable_Access | Func_Call | Ref_Value | '(' Expression ')'; | |
Variable_Access | : Variable Multibit_Part_Access ?; | |
Multibit_Part_Access | : '.' ( Unsigned_Int | '%' ( 'X' | 'B' | 'W' | 'D' | 'L' ) ? Unsigned_Int ); | |
Func_Call | : Func_Access '(' ( Param_Assign ( ',' Param_Assign )* )? ')'; | |
Stmt_List | : ( Stmt ? ';' )*; | |
Stmt | : Assign_Stmt | Subprog_Ctrl_Stmt | Selection_Stmt | Iteration_Stmt; | |
Assign_Stmt | : ( Variable ':=' Expression ) | Ref_Assign | Assignment_Attempt; | |
Assignment_Attempt | : ( Ref_Name | Ref_Deref ) '?=' ( Ref_Name | Ref_Deref | Ref_Value ); | |
Invocation | : ( FB_Instance_Name | Method_Name | 'THIS' | ( ( 'THIS' '.' )? ( ( ( FB_Instance_Name | Class_Instance_Name ) '.' )+ ) Method_Name ) ) '(' ( Param_Assign ( ',' Param_Assign )* )? ')'; | |
Subprog_Ctrl_Stmt | : Func_Call | Invocation | 'SUPER' '(' ')' | 'RETURN'; | |
Param_Assign | : ( ( Variable_Name ':=' )? Expression ) | Ref_Assign | ( 'NOT' ? Variable_Name '=>' Variable ); | |
Selection_Stmt | : IF_Stmt | Case_Stmt; | |
IF_Stmt | : 'IF' Expression 'THEN' Stmt_List ( 'ELSIF' Expression 'THEN' Stmt_List )* ( 'ELSE' Stmt_List )? 'END_IF'; | |
Case_Stmt | : 'CASE' Expression 'OF' Case_Selection + ( 'ELSE' Stmt_List )? 'END_CASE'; | |
Case_Selection | : Case_List ':' Stmt_List; | |
Case_List | :Case_List_Elem ( ',' Case_List_Elem )*; | |
Case_List_Elem | : Subrange | Constant_Expr; | |
Iteration_Stmt | : For_Stmt | While_Stmt | Repeat_Stmt | 'EXIT' | 'CONTINUE'; | |
For_Stmt | : 'FOR' Control_Variable ':=' For_List 'DO' Stmt_List 'END_FOR'; | |
Control_Variable | : Идентификатор; | |
For_List | : Expression 'TO' Expression ( 'BY' Expression )?; | |
While_Stmt | : 'WHILE' Expression 'DO' Stmt_List 'END_WHILE'; | |
Repeat_Stmt | : 'REPEAT' Stmt_List 'UNTIL' Expression 'END_REPEAT'; | |
// Таблица 73 - 76 Элементы графических языков | ||
Ladder_Diagram | : LD_Rung *; | |
LD_Rung | : "синтаксис для графических языков здесь не показан"; | |
FB_Diagram | : FBD_Network *; | |
FBD_Network | : "синтаксис для графических языков здесь не показан"; | |
| ||
// Здесь не рассматривается | ||
Other_Languages | : "синтаксис для других языков здесь не показан"; |