Здравствуйте, netch80, Вы писали:
N>Здравствуйте, VVVa, Вы писали:
VVV>>Интересный вопрос возник как Вы так парсите сначала без методов потом с ними? VVV>>Вы какимто поиском пользуетесь? но в LR вроде его нету...
N>Так а кто говорит конкретно про LR, LL или что-то подобное? Они все как-то не очень соответствуют реалиям таких языков. Иначе бы не писали рукопашные парсеры, а пользовались генераторами вроде YACC или ANTLR.
что-то в обще не понял вы про рекурсивный спуск?
А чем тогда пользуются?
N>С обоими, лексером и парсером. N>На выходе препроцессора, формально, поток лексем. Но как минимум #line и #pragma требуют поддержки в парсере.
а конец \n препроцессора определяется лексером?
N>Написать — да. Но зачем? Если это реальная заказная работа, то ограничиваться C нет смысла, а если это для себя, то вообще к ним лезть не следует, ибо бесполезный гимор.
не я просто сам решил написать свой говно компилятор попроще (видал самопальные С компиляторы в интернете)
N>Нет. У меня нет даже 10 человеко-лет ненужных, чтобы выкинуть их на повторение уже доступных GCC или Clang в худшем варианте.
А сколько человеко-лет уйдёт чтобы написать С компилятор попроще без оптимизаций ?
Здравствуйте, VVVa, Вы писали:
N>>Так а кто говорит конкретно про LR, LL или что-то подобное? Они все как-то не очень соответствуют реалиям таких языков. Иначе бы не писали рукопашные парсеры, а пользовались генераторами вроде YACC или ANTLR.
VVV>что-то в обще не понял вы про рекурсивный спуск?
Типично да, но могут быть варианты (например, Пратт).
VVV>А чем тогда пользуются?
Если нет причины писать всё самому, то генераторы.
YACC (Bison как основной представитель), ANTLR я описал. Они реализуют LR и LL соответственно.
Есть много средств, которые реализуют PEG (его можно условно приравнять к LL(∞)), сейчас это одно из самых популярных.
Ну и так далее.
А вот с учётом реального синтаксиса того же C++ никакой генератор такое не потянет — как уже писал, там местами просто разбор неоднозначный, пока не будет вычислен тип элемента за конкретным словом. Поэтому в компиляторе реально есть интерпретатор части самого C++ и языка его шаблонов, после которых уже можно говорить про конкретные AST.
А ещё учтите, что IDE добавляют свою порцию радости потому, что там нужно не Abstract Syntax Tree, а вполне себе конкретное с сохранением отступов, пробелов, комментариев, конкретных особенностей типа что тут написано a+(b*c) несмотря на то, что a+b*c было бы достаточно по приоритетам — вот так там нужно. Зачем это — чтобы после рефакторинга типа "выделить этот блок как метод" или любого другого аналогичного — автор продолжал бы получать тот же код с другими сдвигами, переименованием переменных и т.п., и чтобы он мог опознать этот код. И вот когда требование держать и менять CST начинает сочетаться со всеми траблами языка... там вообще сложность выше чем зашкальная. Сейчас это ещё передовой фронт парсерной мысли.
Здравствуйте, VVVa, Вы писали:
N>>С обоими, лексером и парсером. N>>На выходе препроцессора, формально, поток лексем. Но как минимум #line и #pragma требуют поддержки в парсере. VVV>а конец \n препроцессора определяется лексером?
Да. Но по факту препроцессор встраивается в лексер.
N>>Нет. У меня нет даже 10 человеко-лет ненужных, чтобы выкинуть их на повторение уже доступных GCC или Clang в худшем варианте. VVV>А сколько человеко-лет уйдёт чтобы написать С компилятор попроще без оптимизаций ?
Ну если ничего больше не делать — месяц можно потратить (пропустив особо тёмные углы языка), два (если и тёмные места закрыть). Но это уже при каком-то реальном опыте.
VVV>Кстати откуда вы столько знаете про компиляторы?
Я очень мало знаю, просто опыт разнообразный. Тут много тех, кто знает больше, и сам писал. Но они что-то пока не включались в дискуссию.
Здравствуйте, netch80, Вы писали:
N>Ну если ничего больше не делать — месяц можно потратить (пропустив особо тёмные углы языка), два (если и тёмные места закрыть). Но это уже при каком-то реальном опыте.
Это вы про Фронтэнд только? Или про весь компилятор?
Как то пытался рекурсивным спуском парсить — сложноватая поддержка получается...(если что-то переделывать то жестоко) с LR парсером полегче
Очень интересует частичный парсинг — его и в ИДЕ наверное вставляют
А LR парсером можно частично парсить?