Что такое хороший ресурс для того, чтобы начинать записать язык программирования, это не свободный контекст? [закрытый]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
14
задан 3 revs, 3 users 100%Alex 18 August 2013 в 15:17
поделиться

12 ответов

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

язык программирования D является примером контекстно-свободной грамматики. C++ является контекстно-зависимым. (Например, T*x объявляет, что x указатель на T, или он умножает T на x? Мы можем только сказать путем поиска T в таблице символов, чтобы видеть, является ли это тип или переменная.)

Пробел не имеет никакого отношения к нему.

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

19
ответ дан 1 December 2019 в 06:49
поделиться

Вы могли бы хотеть прочитать это довольно правильно написанное эссе по парсингу Python, Python: Мифы о Добавлении отступа .

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

Между прочим, вот официальная грамматика Python с python.org: http://www.python.org/doc/current/ref/grammar.txt

6
ответ дан 1 December 2019 в 06:49
поделиться

Я ознакомился бы с проблемой сначала путем чтения на части литературы, это доступно на предмете. Классик Компиляторы книга Aho и. al. может быть тяжелым на математике и аккомпанировать науке, но намного больше доступного текста , Позвольте нам Сборка Компилятор статьи Jack Crenshaw. Это - ряд статей, которые г-н Crenshaw записал обратно в конце 80-х, и это - самый недооцениваемый текст на компиляторах, когда-либо записанных. Подход прост и к точке: г-н Crenshaw показывает" А " подход, который работает. Можно легко пройти содержание в промежутке нескольких вечеров и иметь намного лучшее понимание того, о чем компилятор - все. Несколько протестов состоят в том, что примеры в тексте записаны в Turbo Pascal, и компиляторы испускают 68K ассемблер. Примеры достаточно легки к порту на более актуальный язык программирования, и я повторно комментирую Python для этого. Но если Вы захотите следовать вперед, поскольку примеры представлены, Вам, по крайней мере, будет нужно Turbo Pascal 5.5 и 68K ассемблер и эмулятор . Текст все еще релевантен сегодня, и использующий эти старые технологии действительно забава. Я настоятельно рекомендую его как чей-либо первый текст на компиляторах. Большие новости - то, что языки как Python и Ruby открыты полученный, и можно загрузить и изучить исходный код C, чтобы лучше понять, как он сделан.

5
ответ дан 1 December 2019 в 06:49
поделиться

Я не знаю ни о каких учебных руководствах/руководствах, но Вы могли попытаться смотреть на источник для tinypy, это - очень маленькая реализация Python как язык.

2
ответ дан 1 December 2019 в 06:49
поделиться

Используя добавление отступа на языке не обязательно означает, что грамматика языка не может быть свободным контекстом. Т.е. добавление отступа определит, в котором объеме существует оператор. Оператор все еще будет оператором, неважно, которые определяют объем его, определяется в (объем может часто обрабатываться другой частью компилятора/интерпретатора, обычно во время семантического синтаксического анализа).

, Который сказал, хороший ресурс является antlr инструментом ( http://www.antlr.org ). Автор инструмента также произвел книгу по созданию синтаксических анализаторов для языков с помощью antlr ( http://www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference ). Существует довольно хорошая документация и много грамматик в качестве примера.

2
ответ дан 1 December 2019 в 06:49
поделиться

Если Вы действительно собираетесь взять сильный удар при разработке и реализации языка, Вы могли бы хотеть добавить следующее к своей книжной полке:

  • Прагматика Языка программирования, Scott и др.
  • Концепции проекта на Языках программирования, Turbak и др.
  • современный Дизайн Компилятора, Grune и др. (Я кощунственно предпочитаю это "Книге Дракона" Aho и др.)

Более нежные введения, такие как:

  • учебное руководство Креншо (как предложено 'Jonas Gorauskas' здесь)
  • Категорическая Ссылка ANTLR Пестряткой
  • недавняя работа Martin Fowler над DSLs

необходимо также рассмотреть язык реализации. Это - одна из тех областей, где различные языки значительно отличаются по тому, что они упрощают. Необходимо рассмотреть языки, такие как LISP, F# / OCaml и новый Новояз языка Gilad Bracha.

2
ответ дан 1 December 2019 в 06:49
поделиться

Сделайте, чтобы Вы считали Aho, Sethi, Ullman: "Компиляторы: Принципы, Методы и Инструменты"? Это - справочник классического языка.

/Allan

1
ответ дан 1 December 2019 в 06:49
поделиться

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

Чтение Aho, Sethi и Ullman (это известно как "Книга Дракона") являются хорошим планом. Вопреки другим участникам я говорю, что необходимо играть с более простыми парсерами-генераторами как Yacc и Bison сначала, и только когда Вы записываетесь, потому что Вы не можете сделать чего-то с тем инструментом, должен Вы продолжать пытаться создать что-то с LL (*) синтаксический анализатор как Antlr.

1
ответ дан 1 December 2019 в 06:49
поделиться

Просто, потому что значительное добавление отступа использования языка не означает, что это по сути контекстно-зависимо. Как пример, Haskell использует значительное добавление отступа, и (к моему знанию), его грамматика контекстно-свободна.

примером источника, требующего контекстно-зависимой грамматики, мог быть этот отрывок от Ruby:

my_essay = << END_STR
This is within the string
END_STR

<< self
  def other_method
    ...
  end
end

Другим примером был бы режим XML Scala:

def doSomething() = {
  val xml = <code>def val <tag/> class</code>
  xml
}

Как правило, контекстно-зависимые языки немного более трудно вообразить в любом точном смысле и к настоящему времени менее распространенный. Даже Ruby и Scala не делают действительно количество, так как их контекстно-зависимые функции охватывают только незначительное подмножество языка. На вашем месте я сформулировал бы свою грамматику, поскольку вдохновение диктует, и затем волнуйтесь о парсинге методологий позднее. Я думаю, что Вы найдете, что независимо от того, что Вы придумываете, будет естественно контекстно-свободно, или очень близко к нему.

Как заключительное примечание действительно при необходимости в контекстно-зависимых инструментах парсинга Вы могли бы попробовать некоторые менее твердо формальные методы. Синтаксический анализатор combinators используется в парсинге Scala. У них есть некоторые раздражающие ограничения (никакой lexing), но они не плохой инструмент. LL (*) инструменты как ANTLR также, кажется, более владеют мастерством выражения таких "специальных" Escape парсинга. Не пытайтесь использовать Yacc или Bison с контекстно-зависимой грамматикой, они далеки к строгому для выражения таких понятий легко.

0
ответ дан 1 December 2019 в 06:49
поделиться

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

основная проблема с использованием парсера-генератора состоит в том, что трудно получить хорошее восстановление после ошибки в синтаксическом анализаторе. Если Вы планируете реализацию IDE для Вашего языка, то наличие хорошего восстановления после ошибки важно для того, чтобы заставлять вещи как Intellisence работать. Intellisence всегда работает над неполными синтаксическими конструкциями, и чем лучше синтаксический анализатор при выяснении, что создает пользователя, пытается ввести, тем лучше опыт intellisence можно поставить.

, Если Вы пишете рукописный нисходящий синтаксический анализатор, можно в значительной степени реализовать то, что когда-либо постановляет, что Вы хотите, где когда-либо Вы хотите. Это - то, что помогает обеспечить восстановление после ошибки. Это также сделает это тривиальным для Вас для реализации значительного пробела. Можно просто сохранить то, что текущий уровень отступа находится в переменной в классе синтаксического анализатора и может прекратить анализировать блоки при обнаружении с маркером на новой строке, которая имеет позицию столбцов, которая является меньше, чем текущий уровень отступа. Кроме того, возможности состоят в том, что Вы собираетесь столкнуться с неоднозначностями в своей грамматике. Большинство “production” языков в широком использовании имеет случаи синтаксической неоднозначности. Хорошим примером являются дженерики в C# (существуют неоднозначности вокруг "<"; в контексте выражения это может быть или "меньше" оператор или запуск "универсального списка аргументов"). В рукописном синтаксическом анализаторе, решая неоднозначности как этот тривиальны. Можно просто добавить определенный недетерминизм, где Вам нужен он с относительно небольшим влиянием на остальную часть синтаксического анализатора,

, Кроме того, потому что Вы разрабатываете язык сами, необходимо предположить, что это - дизайн, собирается развиться быстро (для некоторых языков с комитетами по стандартам, как C++ дело обстоит не так). Внесение изменений в автоматически сгенерированные синтаксические анализаторы, чтобы или обработать неоднозначности или развить язык, может потребовать, чтобы Вы сделали значительный рефакторинг грамматики, которая может быть и раздражающей и трудоемкой. Изменения в рукописных синтаксических анализаторах, особенно для нисходящих синтаксических анализаторов, обычно довольно локализуются.

я сказал бы, что парсеры-генераторы являются только хорошим выбором если:

  1. Вы никогда не планируете запись IDE никогда,
  2. , язык имеет действительно простой синтаксис, или
  3. Вы нуждаетесь в синтаксическом анализаторе чрезвычайно быстро и соглашаетесь с плохим пользовательским опытом
1
ответ дан 1 December 2019 в 06:49
поделиться

Контекстно-зависимый язык? Этот не сделал отступ: Протий ( http://www.protiumble.com )

0
ответ дан 1 December 2019 в 06:49
поделиться

«Контекстно-свободный» - термин относительный. Большинство контекстно-свободных парсеров фактически анализируют надмножество языка, не зависящее от контекста, а затем проверяют результирующее дерево синтаксического анализа, чтобы убедиться, что оно допустимо. Например, следующие две программы на C действительны в соответствии с контекстно-свободной грамматикой языка C, но одна из них быстро выходит из строя во время проверки контекста:

int main()
{
    int i;
    i = 1;
    return 0;
}

int main()
{
    int i;
    i = "Hello, world";
    return 0;
}

Без контекста, i = "Hello, world"; - вполне допустимое присвоение, но в контексте вы можете видеть, что все типы неверны. Если бы контекст был char * i; , все было бы хорошо. Таким образом, контекстно-свободный синтаксический анализатор не увидит ничего плохого в этом назначении. Только когда компилятор начнет проверку типов (которые зависят от контекста), он поймает ошибку.

Все, что может быть произведено с помощью клавиатуры, может быть проанализировано как контекстно-свободное; по крайней мере, вы можете проверить, что все используемые символы действительны (набор всех строк, содержащих только отображаемые символы Unicode, является контекстно-свободной грамматикой). Единственное ограничение - насколько полезна ваша грамматика и сколько контекстно-зависимых проверок вы должны сделать для полученного дерева синтаксического анализа.

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

Единственное ограничение - насколько полезна ваша грамматика и сколько контекстно-зависимых проверок вы должны сделать для полученного дерева синтаксического анализа.

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

Единственное ограничение - насколько полезна ваша грамматика и сколько контекстно-зависимых проверок вы должны сделать для полученного дерева синтаксического анализа.

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

3
ответ дан 1 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: