Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Когда в AS3 нужно ставить ";"? (http://www.flasher.ru/forum/showthread.php?t=159123)

wvxvw 27.06.2011 19:22

Когда в AS3 нужно ставить ";"?
 
Столкнулся с непонятной проблемой:
Код AS3:

function foo():void { 100 200 }

не компилируется - требует тз.
Код AS3:

function foo():void
{
    100
    200
}

компилируется.
В чем, собственно, разница?

iNils 27.06.2011 19:29

Во втором случае, ";" ставится автоматически.
Почитай в ECMA-262 раздел 7.9

Psycho Tiger 27.06.2011 19:30

Точка с запятой отделяет друг от друга команды. Но так сложилось, что перенос строки, точка с запятой вещи взаимозаменяемые в приведенном случае. Но не во всех. Например, так нельзя:
Код AS3:

for (
        var i:int = 0
        i < 5
        i++
        ) {
                trace(9);
}

iNils опередил =)
Да, наверное, правильней сказать "ставится автоматически".

wvxvw 27.06.2011 20:32

Ох, спасибо. Очень захотелось чем-нибудь тяжелым по голове, того, кто стандарт писал. На ровном месте, блин такой маразм придумать... токены нарушители, ***...

NikolyA 27.06.2011 20:47

возьми огнетушитель и тяжелое и от жары помогает

кстати, спасибо, интересный фактик

wvxvw 27.06.2011 20:56

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

BlooDHounD 27.06.2011 21:56

точка с запятой разделяет statements. я в парсере добавил 3 строчки. не знаю, что за парсер ты пишешь, но видать, что-то делаешь не так.

wvxvw 27.06.2011 22:37

Схему для Бизона, если интересно, и тремя строчками ты никак не обойдешься. Кроме того, невозможно создать правило которое правильно описывает весь правильный ввод. Поэтому, например:
Код AS3:

function foo():String
{
    return "a"
        + "b";
}

Возвращает "а", а не "ab".

fish_r 27.06.2011 22:45

Цитата:

Сообщение от wvxvw (Сообщение 1006954)
Код AS3:

function foo():String
{
    return "a"
        + "b";
}

Возвращает "а", а не "ab".

а парсер перенос строки не видит? можно было бы инструкцией "или" выкрутиться, нет?

dimarik 27.06.2011 22:58

Это не токены, а лексемы.

wvxvw 28.06.2011 00:03

Это вы расскажите дюжине подписавшихся под ECMAScript документами. Они это токеном назвали.
Ну просто зло берет, когда изза какого-то идиотизма приходится делать кучу работы, которая ну ничего же не улучшит. И, сорри, я вообще злой такой, потому что сегодня еще и спецификацию XMPP читал, и его очевидно прийдтся воплощать в жизнь. Такое впечатление, что интернет был придуман религиозной сектой марсиан аутистов-мазoхистов...

fish_r: Проблема не в том, что не видит, а в том, что +"b" - вполне себе валидное выражение, и с точки зрения парсера, имеет место быть два выражения идущие подряд, а не одно с переносом строки посередине. А вот если перенести плюс на первую строчку, тогда выражение "a"+ будет невалидным, и парсер продолжит читать на следующей строчке.

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

BlooDHounD 28.06.2011 05:06

по поводу ES самый умный Олег на свете как всегда не прав в очевидных случаях. в ES у токенизера есть такой необычный метод isSemicolon, или типа того. в общем стукнись, я тебе дзен открою.

Добавлено через 5 минут
а ваще почитай кнута. у тебя пробелы в теории компиляторов.

wvxvw 28.06.2011 09:47

Блуд, не спорь пожалуйста. Это к компилятору имеет только косвенное отношение, т.как компиляторы тоже используют парсеры. В данном случае я делаю LL(1), вернее, пытаюсь сделать LL(1) парсер, а вот изза такого замечательного планирования это оказалось невозможно. И как бы методов там в принципе быть не может / это не от той стенки гвозди... я вообще говорил про правила вида A -> B | C.

PS. http://www.youtube.com/watch?v=6QI9gF95UxA ;)

BlooDHounD 28.06.2011 16:46

ANTLR пробовал?

wvxvw 28.06.2011 18:02

Давно когда-то, и умаялся настраивать (но пробовал для других целей, для генерации а не парсинга) + Metaas. Bison проще в обращении (никаких заморочек с Явой не нужно) и как бы по-серьезнее будет :).

BlooDHounD 28.06.2011 19:52

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

dimarik 28.06.2011 22:10

Встречал фразы "генераторы компиляторов", "генераторы трансляторов". А вот с преступником Фунтиком я не знаком.

Парсер по мнению Википедии занимается синтаксическим анализом. Компилятор довольно сложная штука, включающая лексический анализ, синтаксический анализ и семантический анализ )

wvxvw 28.06.2011 23:13

http://www.gnu.org/software/bison/ - Знакомтесь, Bison, GNU parser generator :) Что он делает - берет набор правил описаных на его собственном языке (очень напоминающем значки которые используют для описания контекстно-независимых грамматик), и на основании этих правил генерирует парсрер (на Си). Для чего можно было бы использовать: примитивный, но очень быстрый поиск ошибок в исходниках, подсветка кода. Если совершить подвиг и прицепить к нему еще каких-нибудь утилит, то можно было бы, например AS3 байткод оптимизировать с помощью gcc... но это уже для меня очень сильное колдунство :)

dimarik 29.06.2011 00:02

Ладно, почитаю еще. Очень интересная тема.


Часовой пояс GMT +4, время: 14:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.