Парсер для языка программирования

Рейтинг: 2Ответов: 2Опубликовано: 08.04.2011

Мне необходимо написать парсер для языка программирования с досточно сложным синтаксисом. (Ориентиры: Ruby, Smalltalk). Необходимо разбирать операторы с различным приоритетом.

Как это сделать проще и удобнее? Скорость не так важна.

UPD:

Список фич синтаксиса, которые придётся разбирать:

  • Необязательность скобок при вызове метода.
  • Операторы с приоритетами (Приоритеты жёстко заданы заранее)
  • Используются отступы для обозначения аргументов оператора, перенесённых на новую строку.

Пример кода, который необходимо распарсить: здесь

UPD: Книга дракона ещё не прочтена, но уже в пути.

UPD: Ещё вопрос, насколько это будет плохо, если мой парсер будет разбирать код лишь загрузив весь исходник в память? Для языка программирования это фатально?

Ответы

▲ 4Принят

Выбор стоит - либо синтаксически управляемая трансляция (lex/yacc/bison/...), либо "ручками". Если есть время - попробуй оба варианта для небольшого подмножества языка, чтобы понять плюсы и минусы.

Парсинг Ruby делается с помощю синтаксически-управляемой трансляции (судя по исходникам). Теория этого неплохо описана у Ахо.

Из генераторов - пощупай ANTLR, сам не пробовал, но отзывы хорошие.

И ещё раз - без хорошей теоретической подготовки не обойтись, посмотри пару книг, того же Ахо, или Свердлов, или Мозговой.

▲ 3

Для успешного использования Lex, Bison и т.п. надо постоянно их использовать (как собственно и любой инструмент). Иначе, если через годик понадобиться что-либо изменить, возникнут проблемы. Лично я использую C - 'ручками', но естественно после хотя бы полуформального описания (для себя) синтаксиса.

Замечание по поводу отступов, если можно обойтись без них (например используя признак конца или продолжения оператора), то это удобнее при программировании. Вообще, на первый взгляд, такой код парсится за один проход.