синтаксис программы

Предыдущая тема Следующая тема Перейти вниз

синтаксис программы

Сообщение  Eric-S в Вт Сен 30, 2008 11:27 am

Синтаксис basic и freebasic в частности очень любопытен.
Дело в том, что бэйсик в первую очередь ориентировали для удобства человека, а не для удобства алгоритмов разбора.
В бэйсике можно встретить очень оригинальные конструкции, которых нет в других языках программирования.

Например в бэйсике функции и процедуры разделены, а в языке C, процедура это функция которая ничего не возвращает.

Бэйсик разрабатывался как язык для обучения принципам программирования. По этому наглядность и понятность легли в его основу.

Но прошло много времени, задачи изменились, язык перестал быть формальным описанием алгоритмов, и перестал быть игрушкой, сейчас это полноценный язык программирования. Всё это отразилось на синтаксисе.

Тем кто начинает, не имея опыта это не так важно. А вот знакомым с другими языками, такими как C, C++, Java, многие вещи могут показаться очень странными. Именно для них я немного расширю описания, указывая на явные различия и особенные места.

Для тех, кто знаком с qbasic и другими диалектами basic так же дам расширенную информацию, ведь freebasic многое изменил.

Многие вопросы более подробно рассмотрены в соответствующих главах, здесь лишь уделяеться внимание синтаксису.

Для неофитов программирования, хочу особо отметить, важность синтаксиса. Один знак изменит смысл вашей программы. Или просто произойдёт ошибка, ещё при разборе вашего кода.
FreeBasic позволяет человеку большие вольности, чем многие другие языки программирования. Но всё же правила жостки и обязательны.
Будте внимательны.



инструкции

Инструкция, это фрагмент кода, который должен быть выполнен и может считаться одним шагом.
Запутано? Не знаю, как по другому сформулировать. Можно например сказать, что вся программа состоит из команд, команда же это и есть инструкция.
Но инструкция это не просто одна команда, их может быть несколько.

Вот например команда, напечатать приветствие
Код:

print "Hello!"
Это одна инструкция, но также будет одна инструкция, если несколько составных команд, например, сосчитать выражение и напечатать результат.
Код:

print 2 + 3
Несколько команд, но одна инструкция.
Надеюсь вы меня поняли?

Чтобы не путать новичков, в бэйсике инструкция размещаеться на одной строке.
Конец строки - конец инструкции.
Конечно, это не обязательно, но на то должно быть явное желание программиста.

В языках C и прочих унаследовавших его синтаксис инструкция завершаеться символом точки с запятой ";" и может быть размазана и расположена в соответствии с художественным фкусом программера, от чего смысл может быть не сразу понятен.

В бэйсике есть функция print[i]. Она использует символ ";", например
Код:

print "Hello!";
Но смысл совершенно другой. Здесь ";" указывает, что в конец выводимой строки не нужно добавлять символа конца строки.



комментарии

Им посвящена отдельная глава.

Коментарий начинаеться с символа апострофа "'" и продолжаеться до конца строки.
Это так называемые, простые или строчные комментарии.
Коментарий нельзя переносить на другие строки.
Код:

' комментарий

Есть так называемые блочные или сложные комментарии. Они позаимствованы из языка C. Эти комментарии должны иметь явное начало "/'" и явный конец "'/". Причём перенос строки уже не играет роли. Вот например
Код:

print "1" /'234'/ & "5"

или можно так,
Код:

print "1" /'
2
3
4
'/ & "5"




ограничение строк

Произвольный текст, для обработти программой, можно вставить прямо в исходный код программы.
Чтобы ограничить строку, отделив её от инструкций, строку заключают в двойные кавычки (").
Код:

print "строка ограниченная кавычками."

В нутри кавычек может быть любой символ, кроме самих кавычек, т.к. это будет считаться концом строки.
Строки так же нельзя переносить на несколько строк в редакторе кода.

см также
строковый тип данных
работа со строками

примечание:
В саму строку вы можете записать всё что угодно. Например при помощи экранирования символов, даже символ кавычки. Или явно вставляя, любой код, специальными функциями.


препроцессоры

FreeBasic перенял синтаксис препроцессоров у языка C.
Исторически, в бэйсике препроцессоров небыло предусмотрено, но позже они были добавлены. Ради сохранения некой совместимости, этот синтаксис вышел тоже не стандартным.

Вот пример препроцессора в qbasic
Код:

'$include: 'header.bi'
Как вы можете заметить, препроцессорная инструкция оформлена в виде комментария, который начинаеться с символа "$".
Это не удобно, и выглядит очень странно.

Во FreeBasic препроцессорные команды начинаються с символа решотки "#".
Код:

#include "header.bi"
Привычно, стандартно а главное просто и удобно.



составные имена

Если вы кодили на C или Java, то вас могут очень поразить функции:
line input
select case
case else
end select
end if
do while
loop while
и некоторые другие.

В первую очередь вы столкнётесь с [i]if ... then
.
Зачем лишние слова, спросите вы. Объяснение просто, для большей наглядности. Это зделано именно для начинающих, чтобы они не путались в скобочках и составных сложнонаписанных именах функций.
Между прочем, реализация разбора в компиляторе, немного услажнила жизнь создателям freebasic.
А вот разработчики C, руководствовались именно удобством трансляции.

Хочу заметить, что создать свою функцию, с именем из нескольких слов у вас не получиться.


ключевые слова

Это явление, можно считать тоже уникальным. Опять же ключевые слова добавлены именно для удобства.
Ключевые слова, это не функции и не константы, а метки для компилятора.

Вот например открытие файла в языке C
Код:

fh1 = fOpen("myfile.txt", "r");
Да, согласен понятно и лаконично. Но понятно для знающих, а лаконичность, это очень даже хорошо, но важен ведь результат?

По этому, в бэйсике используеться немного иная запись
Код:

open "myfile.txt" for input as #ff1

Здесь, слово "for" не несёт смысла для компилятора, оно только отделяет имя файла от остальной части. А вот человеку, знающему английский будет очень просто.

открыть "myfile.txt" для ввода как №ff1

Слово "input" обозначает "ввод", т.е. ввод будет из файла (чтение).
А слово "output", что вывод будет в файл (запись).

Вот так, нам ключевые слова упростили понимание. А тем, кто помнит модификаторы функции fOpen и как их нужно соеденять, могу пожелать ещё долго не открывать справочники про них.


Замечание, добавлять свои ключевые слова вы не можете.


переносы строк

И всё же переносы строк во FreeBasic возможны.
Но для этого нужно специально указать, что строку нужно перенести. Для этого в её конце поставьте " _ ".
Код:

print "Hello, " & _
"world!"
Так вы сможете разместить одну инструкцию на нескольких строках.


объеденение инструкций

Также в одну строку можно поместить несколько инструкций. Для этого, в конце каждой ставиться знак ":".
Код:

do: sleep: loop while GetKey <> 27
Очень практично, но не всегда будет так красиво.

номер строки

Ещё на заре бэйсика, номера строк были обязательны.
Это было связано с рядом причин, в том числе специфичностью редакторов исходного кода.
Для небольших программ, использование номеров строк, делало их нагляднее.
Но когда листинг программ перестал помещаться на одну страницу, а многочисленные переходы с помощью goto стали только всё запутывать, от номеров строк начали отказываться.

Уже в qbasic v1.0 номера строк были необязательны, а их порядок был неважен.

Номера строк указываються в начале строки, затем пробел и какая-то инструкция.
Код:

10 a = 5
20 input b
30 if a < b then
40 print "a < b"
50 goto 20
60 else
70 print "a >= b"
80 end if
90 print "exit programm"
100 sleep

Вот такой вот архаизм! Вспомнил, старые времена, когда я писал в таком стиле. А сейчас это очень непривычно. Да и не нужно вообщем-то.
(Даже не уверен, в том, что данный синтаксис поддерживаеться. Нужно проверить.)



метка

Метка, в какой-то степени это альтернатива номеру строки.
Метка это именнованная точка в вашей программе.
Вы хотите перепрыгнуть на определённую строку, но незнаете её номер, то метка будет очень даже нормально.

Одно время даже были подпрограммы, вызываемые с помощью gosub.

Метка ставиться в начале строки и закрываеться символом ":".

Код:

a = 5
begin:
input b
if a < b then
print "a < b"
goto begin
else
print "a >= b"
end if
print "exit programm"
sleep

Но будте крайне разборчивы при использовании меток. Злоупотребление прыжками с помощью goto или gosub очень запутывают вашу программу.




список параметров

При вызове функций и процедур, им необходимо передать список параметров.
об этом подробнее смотрите в главе: функции и процедуры.

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

Код:

print mid("abcdefg", 3, 2)

Здесь, мы передаём в функцию mid три параметра: строку "abcdefg", номер первого символа под строки 3, и длину нужной подстроки 2.

Есть несколько нюансов и поблажек.
Например при вызове процедуры, скобочки можно опустить.
Это видно в примере, где параметр mid("abcdefg", 3, 2), для процедуры print указан без скобочек.

В том случае, если от процедуры не требуют возвращения значения, т.е. она используеться как процедура, то скобочки тоже не нужны.

Без скобочек можно обойтись и тогда, когда аргументов нет.


Последний раз редактировалось: Eric-S (Вт Сен 30, 2008 11:49 pm), всего редактировалось 1 раз(а)

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: синтаксис программы

Сообщение  justar в Вт Сен 30, 2008 3:10 pm

Eric-S пишет:Коментарий начинаеться с символа апострофа "'" и продолжаеться до конца строки.
Поддерживается также инструкция REM
Номера строк указываються в начале строки, затем пробел и какая-то инструкция.
(Даже не уверен, в том, что данный синтаксис поддерживаеться. Нужно проверить.)
Поддерживается с ключём компиляции -lang qb

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 43
Откуда : Кишинёв, Республика Молдоа

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: синтаксис программы

Сообщение  tux в Вт Сен 30, 2008 4:58 pm

Коментарий начинаеться с символа апострофа "'" и продолжаеться до конца строки.
Коментарий нельзя переносить на другие строки.
несовсем так, FB поддерживает и многострочные коментарии. По аналогии с Си вместо /*йцу*/ в FB мона использовать /'йцу'/ к примеру так
Код:
print "1" /'234'/ & "5"
или так
Код:
print "1" /'
2
3
4
'/ & "5"

В нутри кавычек может быть любой символ, кроме самих кавычек, т.к. это будет считаться концом строки.
и тут я несогласен, если необходимо использовать кавычку внутри строки, то можно ее экранировать еще одной кавычкой
Код:
print "asd""fgh""jkl"
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: синтаксис программы

Сообщение  Eric-S в Вт Сен 30, 2008 11:35 pm

Tux, спасибо, за поправки
Эта глава посвящена синтаксису вообще.
Про комментарии я поправлю в соответствующей главе.
а про экранирование, это может стать вообще отдельной темой.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: синтаксис программы

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения