Войти
ФлеймФорумПрограммирование

Оцените кусочек кода из google/protobuf/compiler/parser.cc (4 стр)

Страницы: 1 2 3 4
#45
16:20, 27 окт. 2018

Adler
> доставить пробелы, вместо потерянных разделителей - это же костыль, не?
А какие такие разделители ты теряешь? А зачем ты их теряешь?


#46
16:41, 27 окт. 2018

Delfigamer
теряет Tokenizer, т.к ему всё равно что там было между двумя токенами:
1)перевод строки
2)перевод строки+куча пробелов
3)куча пробелов+перевод строки+куча пробелов
4)табы+перевод строки+табы
...

некоторые токенайзеры ещё теряют комментарии, разуметься, со всеми остальными разделителями: пробелами/табами/переводами строк

да кстати, этот как раз из этих:

bool Tokenizer::Next() {
...
    switch (TryConsumeCommentStart()) {
      case LINE_COMMENT:
        ConsumeLineComment(NULL);
        continue;
      case BLOCK_COMMENT:
        ConsumeBlockComment(NULL);
        continue;
      case SLASH_NOT_COMMENT:
        return true;
      case NO_COMMENT:
        break;
  }
...
https://github.com/protocolbuffers/protobuf/blob/0038ff49af882463… nizer.cc#L562

#47
16:58, 27 окт. 2018

Adler
> 1)перевод строки
> 2)перевод строки+куча пробелов
Однозначно восстанавливается из координат токена.
> 3)куча пробелов+перевод строки+куча пробелов
Пробелы в конце строки не нужны.
> 4)табы+перевод строки+табы
Без разницы. Мы тут не исходники архивируем, а сообщения об ошибках выводим, так что если таб превратится в эн пробелов - пофигу.
> некоторые токенайзеры ещё теряют комментарии
Комментарии остаются в исходном тексте, так что

source_file.cpp:62:42: error: no matching function for call to 'iabs'
    std::cout                         << iabs(mylib::PIBuiltinB) << "\n";
                                         ^~~~
source_file.cpp:56:5: note: candidate function not viable: no known conversion from 'const mylib::PropertyId' to 'int' for 1st argument
int iabs(int x)
в ответ на
int main()
{
    std::cout /* << "a cool story" */ << iabs(mylib::PIBuiltinB) << "\n";
    std::cout << (user::PIUserB - mylib::PIBuiltinB) * 200 << "\n";
}
пользователь уж как-нибудь да переживёт.
#48
(Правка: 17:03) 17:02, 27 окт. 2018

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

#49
(Правка: 17:23) 17:23, 27 окт. 2018

Delfigamer
> Однозначно восстанавливается из координат токена.
когда есть только одна стадия - да. а если их например 4 и на первой Tokenizer потерял все комментарии, то в сообщении об ошибке на последней стадии их не будет и от этого юзеру дебажить причину возникновения ошибки глядя на текст ошибки будет труднее.

Delfigamer
> Без разницы. Мы тут не исходники архивируем, а сообщения об ошибках выводим,
> так что если таб превратится в эн пробелов - пофигу.
да, обычно пофигу, но не всегда. а если не всегда - значит Tokenizer как строительный блок с точки зрения проектирования - костыль. если нет профита от Tokenizer по сравнению с другим решением, то очевидно он никому не нужное говно, но это не так, т.к профит вроде есть: нубам так проще и на результат почти не влияет, для мелких проектов работающих на мусорное ведро - так и вообще однозначный лидер.

Delfigamer
> пользователь уж как-нибудь да переживёт.
в данном случие, да, но вообще может и не пережить :)

#50
17:28, 27 окт. 2018

Delfigamer
> - это не проблема и вообще не нужно
тут ненужно, а вообще - мега полезная вещь, можно верификацию парсера на халяву получить.

Delfigamer
> гугл всё сделал по-человечески
по-человечески - какой шифровальщик, а :)
по мне так у них всё нормально сделано.

#51
(Правка: 0:21) 0:19, 28 окт. 2018

Delfigamer
> парсер - это вещь, которая читает содержимое текстового файла
тут да, но JSON.parse из JavaScript`а с тобой не согласен.

#52
0:25, 28 окт. 2018

war_zes
> p.s. чистый код пишут не ради оптимизации, поэтому твое замечание про дрочку
> байтов неуместно
все пишут ради оптимизации, ну почти. разница только в параметрах по которым оптимизация производится.

#53
5:03, 28 окт. 2018

ТС какой то упоротый. Ему говорят что все нормально, все работает отлично уже 70 лет, а он уперся. И вроде не школота - 2007 зареган (я то и то только 13-го на старом аке), а ума нет.

#54
(Правка: 10:55) 10:21, 28 окт. 2018

Olaf85
> а ума нет
был бы умный - наращивал бы бабло/респекты/активы игнорируя здравый смысл/здоровье/старение/опасность/риск, а не к мелочам придерался.

#55
(Правка: 18:07) 18:03, 28 окт. 2018

Adler
> тут ненужно, а вообще - мега полезная вещь, можно верификацию парсера на халяву
> получить.
https://en.cppreference.com/w/cpp/language/escape тоже будешь через весь AST тянуть? Чтобы "\x66\x6f\z      \111\x0a" по ходу компиляции вдруг не превратилось в "foo\n"?
00123E+002 тоже будешь хранить в текстовом виде до самого конца? С 00123e+002 не перепутаешь?
А если у тебя посреди оптимизаций появится варнинг? Будешь и через IR весь исходный текст тащить? А если потом ещё и линкер работает - будешь вместе с каждой инструкцией хранить кусочек AST?
Или же есть какая-то стадия, на которой такие детали можно наконец отбросить? Как определить тот момент, когда исходный текст перестаёт быть нужным?

Adler
> JSON.parse из JavaScript`а с тобой не согласен.

A computer file is a computer resource for recording data discretely in a computer storage device.

По какому параметру строковый объект не подходит под это определение? Потому что в джаве 16-битные ячейки? Потому что расположен на энергозависимом носителе? Потому что указатели на объекты не образуют иерархии?
#56
20:30, 28 окт. 2018

Эх, что-то я опоздал...

+ Мой вариант

Страницы: 1 2 3 4
ФлеймФорумПрограммирование