Построение переводчика в Smalltalk - PullRequest
2 голосов
/ 24 октября 2010

Мне нужно построить переводчик на языке smalltalk. Он будет интерпретировать простой язык с небольшим фиксированным набором инструкций, в нем всего 2 типа данных, и он оценивает выражение в постфиксном виде. Сам язык интерпретируется построчно, и интерпретатор выдаст ошибку при обнаружении неправильного набора команд.

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

Спасибо.

Ответы [ 3 ]

2 голосов
/ 25 октября 2010

Это не слишком сложно для реализации.

Постфиксные языки легко реализуются с помощью стека. В Smalltalk стек может быть OrderedCollection, для которого вы используете методы addLast: и removeLast.

Если язык интерпретируется построчно, ваш основной цикл интерпретатора может выглядеть примерно так:

instructions := sourceCode subStrings: (Character cr asString).
instructions do: [:eachInstruction | ...]

Одним из способов структурирования кода было бы создание класса Interpreter, который имеет стек переменную-член и метод для каждой языковой инструкции.

Эти методы инструкции могут выглядеть примерно так:

addInstruction
| op1 op2 |
op1  := stack removeLast.
op2  := stack removeLast.
stack addLast: (op1 + op2).
1 голос
/ 24 октября 2010

Если вы создаете интерпретатор постфиксной нотации, вы как бы создаете четвертый интерпретатор. Здесь множество ссылок на четвертые ресурсы.

0 голосов
/ 02 февраля 2011

Перед интерпретацией самого языка вы должны использовать отдельный синтаксический анализатор, чтобы убедиться, что выражение правильно сформировано. PetitParser может быть полезно для этого.

...