FreeBASIC грамматика
 
Грамматика Обозначения

Формат производства
левая сторона: правая сторона;

: следует читать как "определяется как".

Правая часть производства завершение;.

Слово курсивом представляют имя производства (левая
часть производство).

Немного операторов используется, чтобы описать грамматику FreeBASIC.

операторзначение
. любой символ
*0 или больше (повторение)
+ 1 или больше (повторение)
?опционально (выборочно)
() группа
|разделитель (альтернативы разделителю)
semicolon конец производства


Любой символ, который отображается в правой стороне, не в качестве оператора и не выделен курсивом представляет сам себя и отображается жирным шрифтом.
Символ в правой стороне правила может относиться к производству.
Такие ссылки курсивом.

Для навигационных целей ссылки переводят на пояснения.

При чтении грамматики нужно знать, что FreeBASIC является не регистрозависимым.

Представленная грамматика не является точным заявлением языка FreeBASIC.

Пойдите в:
программа
выражения

Маркеры

white (горизонтальная табуляция): \t |
any_char (любые симолы):   any valid character;
eol (переносы):    \n|\r|\n\r;
statement_separator (разделители): ( : | eol )+;
dot (точка):         .;
sign (знак):        +|-;
alpha (альфа):      a|b|c|d|e|f|g|h|i|j|k|l|m|n|p|q|r|s|t|v|w|x|y|z;
digit (числа):       0|1|2|3|4|5|6|7|8|9;
hexdigit (шестнадцатеричные числа):   a|b|c|d|e|f|digit;
octdigit (восьмеричные числа):   0|1|2|3|4|5|6|7;
bindigit (двоичные числа):   0|1;
alphadigit (альфа числа):  alpha| digit;
integer_suffix (суффиксы для целых):     %|&|l|u|ul|ll|ull;
floating_point_suffix (суффиксы для дробных):     !|#|f;
suffix (суффикс):      integer_suffix|floating_point_suffix|$;
expchar:  d|e;
operator (оператор)
: = | < | > |<> |+ | - | * | @
& | -> | / | \ | ^ | andalso
orelse | and | or | xor | eqv | imp
+= | -= | *= | /= | \= | ^= | &= |
and= | or= | xor= | eqv= | imp=
new | delete | delete[] | cast | procptr
varptr | strptr | sizeof | [] | ()
;

binary_operator (бинарный оператор)
: = | < | > |<> |+ | - |
& | -> | / | \ | ^
+= | -= | *= | /= | \= | ^= | &= |
and= | or= | xor= | eqv= | imp=
andalso | orelse
;

identifier (идентификатор)
:  (alpha)(alphadigit|_)*
nbsp _(alphadigit|_)+
;

literal (литерал)
integer_literal (целые литералы)
decimal_integer (десятичные литералы): digit+;
hexadecimal integer (шестнадцатеричные литералы): &hhexdigit+;
octal_integer (восьмеричные литералы): &ooctdigit+;
binary_integer (двоичные литералы): &bbindigit+;

floating_literal (дробные литералы)
: digit+(dot(digit+)?)?(exp_char?(sign?digit+)?)?suffix?
nbsp(dot(digit+)?)?(exp_char?(sign?digit+)?)?suffix?
;

string_literal (строковые литералы)
escape_sequence (управляющие последовательности)
simple_escape_sequence (простые управляющие последовательности)
: \a|\b|\f|\l|\n|\r|\t|\v|\\|\'|\"
;

unicode_escape_sequence (юникод управляющие последовательности)
decimal_escape_sequence (десятичные управляющие последовательности)
hexadecimal_escape_sequence (шестнадцатеричные управляющие последовательности)
octal_escape_sequence (восьмеричные управляющие последовательности)
binary_escape_sequence (бинарные управляющие последовательности)
Комментарии

comment (комментарии)
: ( ' | rem) (($directive) | (any_char_but_eol*))
;
multiline_nested_comment (многострочные комментарии)
: /' ( . | multiline_nested_comment)* '/;

Верхний уровень

program (программа)
: line* EOF?
;
line (строка)
label (метка)
: identifier :
;

statement (оператор)
(declaration | procedure_call_or_assign | compound_statement | quirk_statement | assembler_block | assignment )?
(statement_separator statement)*
;

declaration (декларация)
procedure_call_or_assign (процедура вызова или назначения)
: call identifier ((procedure_parameter_list))?
identifier procedure_parameter_list?
(identifier | function | operator | property) = expression
;

compound_statement (составной оператор)
namespace_statement (оператор пространтсва имен)
: namespace identifier (alias string_literal)? (declaration | namespace_statement)* end namespace
;

scope_statement (оператор области видимости): scope statement_separator statement* end scope
;

if_statement (IF оператор)
short_if_statement (укороченный IF оператор)
else statement_separator statement*
(eol| end if | endif)
;

long_if_statement (длинный IF оператор)
statement*
elseif_block*
(else statement_separator statement*)?
(end if|endif)
;

elseif_block (блок elseif)
for_statement (FOR оператор)
(statement|exit for(, for)* | continue for (, for)*)* next identifier (, identifier)* statement_separator
;

do_statement (DO оператор)
: do (until|while) expression (statement|exit do (, do)* | continue do (, do)*)* loop
do (statement|exit do (, do)* | continue do (, do)*)* loop (until|while) expression statement_separator
;

while_statement (WHILE оператор)
(statement | exit while (, while)* | continue while (, while)*)*
wend
;

select_statement (SELECT оператор)
: select case (as const) expression case_statement* case else statement_separator statement* end select
;
case_statement (CASE оператор)
case_expression (CASE выражение)
: expression | expression to expression | is (> | < | >= | <= | = | <>) expression;

assembler_block (ассемблерный блок)
: asm comment? (asm_code comment? eol)+ end asm
;

assignment (назначение)
variable (переменная)
const_declaration (декларация константы)
: const (as symbol_type)? const_assign (, const_assign)*
;

type_or_union_declaration (декларация типа и объеденения)
type_declaration (декларация типа)
union_declaration (декларация объеденения)
: union identifier (alias string_literal)? (field = expression)? (comment)? statement_separator
union_member_declaration+
end union
;

type_member_declaration (декларация пользовательского типа)
: ( (union|type) comment? statement_separator element_declaration+
end (union|type)
)
element_declaration
as as_element_declaration
;


variable_declaration (декларация переменной)
: (redim preserve?|dim|common) shared? symbol_type
extern import? symbol_type alias string_literal
static symbol_type
;

symbol_type (символьный тип)
: const? unsigned?
(
scalar
string (* integer_literal)?
wstring (* integer_literal)?
user_defined_type
function (( parameters )) (as symbol_type)
sub (( parameters ))
)(const? (ptr|pointer))*
;

scalar (скаляр)
: byte
ubyte
short
ushort
integer
uinteger
longint
ulongint
long
ulong
single
double
;

parameters (параметры)
parameter (параметр)
: (byval|byref)? (identifier (( ))?)? as symbol_type (= literal)?
;


user_defined_type (пользовательский объявленный тип)
procedure_declaration (декларация процедуры)
procedure_parameter_list (лист параметров процедуры)
procedure_parameter (параметр процедуры)
: byval? (identifier(( ))? | expression )
;


выражения

expression (выражение)
boolean_expression (булевое выражение)
: logical_expression( ( andalso | orelse ) logical_expression)*
;

logical_expression (логическое выражение)
: logical_or_expression ( (xor | eqv | imp) logical_or_expression )*
;

logical_or_expression (логическое OR выражение)
logical_and_expression (логическое AND выражение)
relational_expression (сравнительные выражения)
concatenation_expression (выражения объеденения)
add_expression (ADD выражения)
shift_expression (сдвиг бит выражения)
: mod_expression ( (shl | shr) mod_expression )*
;

mod_expression (модуль числа выражения)
integer_division_expression (целочисленное деление выражения)
multiplication_expression (умножение выражение)
exponentiation_expression (возведение в степень выражения)
prefix_expression (преффикс выражения)
highest_precedence_expression (высокий приоритет выражения)
address_of_expression (получение адреса выражения)
: varptr ( highest_precedence_expression )
procptr ( identifier (())? )
@ (identifier (())? | highest_precedence_expression)
sadd|strptr ( expression )
;

dereference_expression (различные выражения)
casting_expression (преобразование выражения)
: cast ( symbol_type , expression )
;


quirk_function
quirk_function_name
: mkd | mki | mkl | mklongint | mkshort
cvd | cvi | cvl | cvlongint | cvs | cvshort
asc | chr | instr | instrev | lcase | left | len | lset | ltrim | mid | right | rset | rtrim | space | string | ucase | wchr | wstr | wstring
abs | sgn | fix | frac | len | sizeof,sin | asin | cos | acos | tan | atn | sqr | log | exp | atan2 | int
peek
lbound | ubound
seek | input | open | close | get | put | name
err
iif
va_first
cbyte | cshort | cint | clng | clngint | cubyte | cushort | cuint | culng | culngint | csng | cdbl | csign | cunsg
type
view | width | color | screen
;



quirk_statement
jump_statement (прыжок оператор)
: goto identifier
;

print_statement (PRINT  оператор)
: (print | ?) (# expression ,)? (using expression ;)? (expression? ; | , )*;

data_statement (DATA  оператор)
: restore identifier
read variable (, variable)*
data literal (, literal)*
;

array_statement (массив  оператор)
: erase variable (, variable)*
;

line_input_statement (LINE INPUT  оператор)
: line input ;? (# expression| expression?) (, | ; )? variable?
;

input_statement (INPUT  оператор)
: input ;? ((# expression| string_literal) (, | ;))? variable (, variable)*
;

poke_statement (POKE  оператор)
file_statement (файловые  операторы)
: close (#? expression) (, #? expression)*
;

write_statement
: write (# expression)? (expression? , )*
;

error_statement (Вывод ошибок  оператор)
: error expression
err = expression
;

on_statement (ON  оператор)
: on local? (error | expression) goto identifier
;

view_statement (VIEW  оператор)
: view (print (expression to expression)?)
;

mid_statement (MID  оператор)
lrset_statement (Вставка  оператор)
width_statement (WIDTH  оператор)
: width expression , expression
width lprint expression
width (# expression| expression), expression
;

color_statement (ЦВЕТ  оператор)
: color expression , expression
;

gfx_statement (QFX  оператор)
: pset ( expression , )? step? ( expression , expression ) (, expression )?
line ( expression , )? step? (( expression , expression ) )? - step? ( expression , expression ) (, expression? (, string_literal? (, expression )?)?)?
circle ( expression , )? step? ( expression , expression ) , expression ((, expression? (, expression? (, expression? (, expression (, expression)? )? )?)?)?)?
paint ( expression , )? step? ( expression , expression ) (, expression? (, expression? ) )
draw ( expression , )? expression
view (screen? ( expression , expression ) - ( expression , expression ) (, expression? (, expression)?)? )?
palette get? ((using variable) | (expression , expression (, expression , expression)?)?)
put ( expression , )? step? ( expression , expression ) , ( ( expression , expression ) - ( expression , expression ) ,)? variable (, expression (, expression)?)?
get ( expression , )? step? ( expression , expression ) - step? ( expression , expression ) , variable
screen (integer_literal | ((expression (((, expression)? , expression)? expression)? , expression))
screenres expression , expression (((, expression)? , expression)? , expression)?
;