Грамматика
Обозначения
Формат производства
левая сторона: правая сторона;
: следует читать как "определяется
как".
Правая часть производства
завершение;.
Слово курсивом представляют имя
производства (левая
часть производство).
Немного операторов используется,
чтобы описать грамматику 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 (идентификатор)
literal (литерал)
integer_literal (целые литералы)
decimal_integer (десятичные литералы):
digit+;
hexadecimal integer (шестнадцатеричные
литералы):
&hhexdigit+;
octal_integer (восьмеричные литералы):
&ooctdigit+;
binary_integer (двоичные литералы):
&bbindigit+;
floating_literal (дробные литералы)
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
(многострочные комментарии)
Верхний уровень
program (программа)
line (строка)
label (метка)
statement (оператор)
(
declaration |
procedure_call_or_assign |
compound_statement |
quirk_statement |
assembler_block |
assignment )?
(
statement_separator statement)*
;
declaration (декларация)
procedure_call_or_assign
(процедура вызова или назначения)
compound_statement (составной
оператор)
namespace_statement (оператор
пространтсва имен)
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 оператор)
while_statement (WHILE
оператор)
(
statement |
exit while (
, while)* |
continue while (
, while)*)*
wend
;
select_statement (SELECT
оператор)
case_statement (CASE
оператор)
case_expression (CASE
выражение)
assembler_block (ассемблерный блок)
assignment (назначение)
variable (переменная)
const_declaration (декларация
константы)
:
const (
as symbol_type)?
const_assign (
, const_assign)*
;
type_or_union_declaration
(декларация типа и объеденения)
type_declaration (декларация типа)
union_declaration (декларация
объеденения)
type_member_declaration
(декларация пользовательского типа)
variable_declaration (декларация
переменной)
symbol_type (символьный тип)
:
const?
unsigned?
(
scalar
)(
const? (
ptr|
pointer))*
;
scalar (скаляр)
:
byte
ubyte
short
ushort
integer
uinteger
longint
ulongint
long
ulong
single
double
;
parameters (параметры)
parameter (параметр)
user_defined_type (пользовательский
объявленный тип)
procedure_declaration (декларация
процедуры)
procedure_parameter_list (лист
параметров процедуры)
procedure_parameter (параметр
процедуры)
выражения
expression (выражение)
boolean_expression (булевое выражение)
logical_expression (логическое
выражение)
logical_or_expression (логическое
OR
выражение)
logical_and_expression (логическое
AND
выражение)
relational_expression
(сравнительные выражения)
concatenation_expression
(выражения объеденения)
add_expression (
ADD
выражения)
shift_expression (сдвиг бит выражения)
mod_expression (модуль числа выражения)
integer_division_expression
(целочисленное деление выражения)
multiplication_expression
(умножение выражение)
exponentiation_expression
(возведение в степень выражения)
prefix_expression (преффикс выражения)
highest_precedence_expression
(высокий приоритет выражения)
address_of_expression (получение
адреса выражения)
:
varptr ( highest_precedence_expression
)
;
dereference_expression (различные
выражения)
casting_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 (прыжок оператор)
print_statement (PRINT
оператор)
data_statement (DATA
оператор)
array_statement (массив оператор)
line_input_statement (LINE
INPUT
оператор)
input_statement (INPUT
оператор)
poke_statement (POKE
оператор)
file_statement (файловые операторы)
write_statement
error_statement (Вывод ошибок
оператор)
on_statement (ON
оператор)
:
on local? (
error |
expression)
goto identifier
;
view_statement (VIEW
оператор)
mid_statement (MID
оператор)
lrset_statement (Вставка оператор)
width_statement (WIDTH
оператор)
color_statement (ЦВЕТ оператор)
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)?
;