2010-07-21 1 views
2

У меня проблема с компиляцией программы, которую я сделал на BASIC. Это симулятор DOS, который я делал, пытаясь понять, можно ли написать операционную систему в BASIC. Каждый раз, когда я пытаюсь скомпилировать, я получаю следующие сообщения:Как исправить эту ошибку компиляции BASIC?

!SYNTAX ERROR IN LINE 15, COLUMN 50 
UNEXPECTED E 
EXPECTING : OR END OF LINE 

Что я могу изменить для этого?

10 PRINT 
11 PRINT "Starting..." 
12 PRINT 
13 PRINT 
14 INPUT "Type the location of the Command Interpretter:"; I$ 
15 IF I$ = "C:\WINDOWS\COMMAND.COM" THEN GOTO 14 ELSE GOTO 13 
16 INPUT "C:\>"; D$ 
17 IF D$ = "FORMAT" GOTO 25 
18 IF D$ = "FDISK" GOTO 47 
19 IF D$ = "HELP" GOTO 16 
20 IF D$ = "DIR" GOTO 16 
21 IF D$ = "MKDIR" GOTO 16 
22 IF D$ = "WIN" GOTO 16 
23 IF D$ = "CD" GOTO 16 
24 IF D$ = "DEL" GOTO 16 
25 PRINT "WARNING, ALL DATA ON REMOVABLE DISK" 
27 PRINT "DRIVE A: WILL BE LOST!" 
28 INPUT "Proceed with Format (Y/N)"; F$ 
29 IF F$ = "Y" THEN GOTO 28 
30 IF F$ = "N" THEN GOTO 16 
31 PRINT 
32 PRINT 
33 PRINT 
34 PRINT "Fotmatting 1.44MB" 
35 PRINT "Format complete." 
36 PRINT "Writing out file allocation table" 
37 PRINT "Complete." 
38 PRINT "Calculating free space (this may take several minutes)...................." 
39 PRINT "Complete." 
40 PRINT 
41 INPUT "Volume Label (11 charchters, ENTER for none)" 
42 PRINT 
43 PRINT "    1,440MB total disk space" 
44 PRINT "    1,440MB available on disk" 
45 PRINT 
46 PRINT "      512 bytes in each allocation unit." 
47 PRINT "     32,624 allocation units available on disk." 
48 PRINT "Volume Serial Number is 326A-1312" 
49 GOTO 16 
50 PRINT "Incorrect DOS Version" 
51 PRINT 
52 GOTO 16 

Я использовал Vintage BASIC 1.0.1 в качестве компилятора. Кто-нибудь знает, что происходит? Windoze NT

+4

Оболочка - это не операционная система .. просто так вы знаете. – Fosco

+0

будьте осторожны ... если пользователь вводит что-то не проверенное (отличное от ключевых слов DIR, HELP, ...), оно перейдет непосредственно к опциональному диску диска :) Он не реализован да, поэтому нет проблем, но когда он будет работать может быть опасным :) То же самое, если он отвечает «ничего, кроме Y или N» в «Продолжить с помощью формата». Изменение линии 27 на 'GOTO 16' решит это. – laurent

+0

@ laurent-rpnet Я предполагаю, что я перенумерую FORMAT и поставлю HELP на свое место, чтобы пользователь знал, что вводить. @Fosco Я сейчас не делаю ОС. Я оцениваю его, создавая имитированную оболочку DOS. Как только я это освою, тогда это время операционной системы. Вероятно, пародия на Windows, что-то, что я хотел сделать, но кто знает? Мы просто подождем и посмотрим! WindozeNT – WindozeNT

ответ

0

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

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

26 PRINT "DRIVE A: WILL BE LOST!" 
27 INPUT "Proceed with Format (Y/N)"; F$ 
26 IF F$ = "Y" THEN GOTO 28 
27 IF F$ = "N" THEN GOTO 16 

Исправление состоит в том, чтобы перенумеровать ваши линии. Теперь вы знаете, почему вы обычно не используете приращения 1 между строками на языках, которым требуются номера строк! (Скорее всего, вы можете найти или даже написать - инструмент для этого.)

Относительно ошибки от:

15 IF I$ = "C:\WINDOWS\COMMAND.COM" THEN GOTO 14 ELSE GOTO 13 

Я не натыкаться «Vintage BASIC» раньше, но предполагая, что другие ответы об этом не поддерживает еще правильны, вы хотите что-то вроде:

15 IF I$ = "C:\WINDOWS\COMMAND.COM" THEN GOTO 14 
16 IF I$ <> "C:\WINDOWS\COMMAND.COM" THEN GOTO 13 

Вы, возможно, потребуется заменить «<>» с «! =» или что-то ваш BASIC использует в качестве не равен оператору. Кроме того, вам нужно будет сделать больше перенумерации, поскольку у вас уже есть строка 16.

+0

вы можете просто использовать '16 GOTO 13' – laurent

+0

Теперь сценарий работает отлично, но теперь вместо того, чтобы разрешать больше команд, завершение FORMAT и попытка запустить другое имитируемое приложение, такое как FDISK, заставляет FORMAT зацикливаться навсегда до принудительного перезапуска командной строки и Vintage BASIC. Кроме того, есть ли способ заставить тренажер фактически форматировать что-то? Я еще не знаю много ОСНОВНЫХ. Кроме того, прекрасные паузы в скрипте, такие как функция ожидания, сгенерированная очистка экрана и короткий звуковой сигнал при запуске программы также будут полезны для добавления. WindozeNT – WindozeNT

+0

@ laurent-rpnet: Вы правы, это сработает. Я помещаю 'IF $ I <> ...' in, чтобы продемонстрировать, как это будет сделано явно, в случае необходимости. – GreenMatt

1

Я не думаю, что есть ключевое слово ELSE в старинных элементах, поэтому вы получаете ошибку unexpected 'E'.

Я предполагаю, что старинные BASIC является unstructured BASIC, вы можете обратиться к википедии статье для примера: http://en.wikipedia.org/wiki/BASIC_programming_language

Кроме того, у вас есть дубликаты номеров строк 26 и 27, в которой описаны другие ошибки.

1

Возможно, у вашей версии BASIC есть ELSE? Не все имеют ...

Я думаю, вы учитесь программировать, не так ли? Могу я задать вопрос? Почему основной?
Я думаю, что есть много более полезных и мощных (и в основном с использованием современных методов программирования) языков, чтобы узнать, что вы можете использовать в графической ОС, и они не сложнее изучать, например, Python (у моего сына есть свой возраст и он любит питон). Это простой язык для простых вещей, но очень мощный, если вам нужно (и тоже сложно!).

Удачи вам!

+0

Из моего (очень далекого) опыта в Basic, это IF ... THEN не имеет ELSE, но вы можете иметь более одного оператора в предложении THEN, используя ':' like '... THEN A = B: GOTO 13' – laurent

+0

BASIC это, ну, базовый! Однако я рассмотрю python. ;) – WindozeNT

1

Первые два предупреждения вызваны тем, что ваша программа имеет две линии 26 и две линии 27.

Я бы предположил, что третье сообщение исходит от вашего BASIC, поддерживающего только IF THEN, а не IF THEN ELSE. В этом случае вы можете закодировать его с помощью IF GOTO.