В этой статье описывается реализация Java для определения простой языковой функции, основанной на шаблоне интерпретатора. Поделитесь этим для вашей ссылки, следующим образом:
Определение шаблона
Образец интерпретатора: он должен дать грамматическое представление языка и определить интерпретатора для интерпретации предложений на языке. Паттерн интерпретатора описывает, как интерпретировать эти операторы, используя дизайн шаблона после простой грамматики.
Примеры второго режима
1 Анализ шаблона
Мы разработали язык, чтобы самостоятельно проиллюстрировать этот шаблон
(1) Язык чувствителен к случаям (2) Язык начинается с программы и заканчивается концом (3) println означает печать линии и разбить ее (4) Использование для… от… до… End Mine Loop
Пример языкового содержания заключается в следующем:
Program Println Start ... для I от 90 до 100 println I End Println End ... End
Значение этого предложения: сначала распечатайте разрыв строки с «Start ...», затем пройдите пробел линии с «90», «91», ... «100» и, наконец, печатайте разрыв строки с «End ...».
2 Этот язык объясняет структуру дерева
3 Диаграмма активности языкового интерпретатора
4 примеры кода
4.1 Создание контекстной среды - контекст
пакет com.demo.interpreter.context; import java.util.hashmap; import java.util.iterator; import java.util.map; import java.util.stringtokenizer;/** * Контекстно * * @author * */public class context {// текстовый контент для приватного финального финального строки stringtokenizer; // текущая команда частной строки currentToken; // используется для хранения динамического изменения информационного содержимого частного окончательного карты <строка, объект> map = new hashmap <string, object> (); / ** * Constructor устанавливает содержание анализа * * * @param Text */ public Context (String Text) {// Использование пространств, чтобы отделить текст, чтобы проанализировать это. Stringtokenizer = new StringTokenizer (Text); } / *** Парирование текста* / public String next () {if (this.stringtokenizer.hasmoretokens ()) {currenttoken = this.stringtokenizer.nexttoken (); } else {currentToken = null; } вернуть CurrentToken; } / ** * Определите, является ли команда правильной * * @param Command * @return * / public boolean equalswithCommand (строка команда) {if (command = null ||! Command.equals (this.currentToken)) {return false; } вернуть true; } / ** * Получить текущее содержимое команды * * @return * / public String getCurrentToken () {return this.currentToken; } / ** * Получить содержимое узла * * @return * / public String getTokenContent (String Text) {String Str = Text; if (str! = null) {// заменить динамически изменение контента в карте и вернуть итератор <string> // Заменить динамически изменение контента в карте и вернуть итератор <string> iterator = this.map.keyset (). iterator (); while (iterator.hasnext ()) {string key = iterator.next (); Объект obj = map.get (key); str = str.replaceall (key, obj.toString ()); }} return str; } public void put (String Key, значение объекта) {this.map.put (key, value); } public void clear (String Key) {this.map.remove (key); }}4.2 Интерфейс экспрессии - iexpressions
пакет com.demo.interpreter.express; import com.demo.interpreter.context.context;/** * * * * / ** * Метод выполнения * * @param context */ public void roternate ();}
4.3 Основное выражение - Programexpression
пакет com.demo.interpreter.express; import com.demo.interpreter.context.context;/** * Программа выражение * * @author * */public Class Programexpression реализует iexpressions {// Контекст среды Частный окончательный контекст контекста; // текущая команда частная окончательная статическая строка команда = "программа"; // хранить следующую ссылку на выражение частных экспрессионных выражений; / ** * Конструктор передает контент, который будет проанализирован в * * @param text */ public programexpression (строка текста) {this.context = new Context (text); this.parse (this.context); } @Override public void parse (контекст контекста) {// Получить первый командный узел this.context.next (); } / *** Метод объяснения реализации* / @Override public void roternt () {// определить, начинается ли он с программы if (! This.context.equalswithcommand (command)) {System.out.println ("the '' + command +" 'за исключением запуска! "); } else {// запустить this.context.next () с программой; this.Expressions = new ListExpression (); this.expressions.parse (this.context); // Выражение ListExpression начинает анализировать это. Expressions.Interpret (); }}}4.4 Список выражения - ListExpression
пакет com.demo.interpreter.express; import java.util.arraylist; import java.util.iterator; import com.demo.interpreter.context.context;/** * Список выражения * * @author * */public class distexpression earments iexpressions {private context; Private Final ArrayList <iexpressions> list = new ArrayList <iexpressions> (); / ** * Конструктор передает контекст, который будет проанализирован в * * @param context */ public void parse (контекст контекста) {this.context = context; // В выражении диаграммы ListExpression, цикл для интерпретации каждого слова в утверждении до тех пор, пока выражение или исключение терминатора не выйдет, в то время как (true) {if (this.context.getCurrentToken () == null) {// Получить текущий узел. Если null, это означает, что конечное выражение отсутствует System.out.println («Ошибка: в экспертиве отсутствует« конец »!»); перерыв; } else if (this.context.equalswithcommand ("end")) {this.context.next (); // диапазон обычно заканчивается разрыв; } else {// Создать командное выражение iexpressions expressions = new CommandExpersion (this.context); // Добавить в list.add (выражения); }}} / *** Реализовать метод объяснения* / @Override public void rotport () {// цикл объяснения каждого выражения в списке списка для выполнения итератора <iexpressions> iterator = list.iterator (); while (iterator.hasnext ()) {(iterator.next ()). rotport (); }}}4.5 Экспрессия команды - CommandExpersion
пакет com.demo.interpreter.express; import com.demo.interpreter.context.context;/** * Command Expression * * @author * */public campase CommandExpersion IexPressions {private конечный контекст контекста; частные выражения iexpressions; / ** * Метод построения передает контекст, который будет проанализирован в * * @param context */ public CommandExperssion (контекст контекста) {this.context = context; this.parse (this.context); } public void parse (контекст контекста) {// Судя по текущей категории команды, только отличите и исходную команду if (this.context.equalswithcommand ("for")) {// Создание для выражения для парсионного эксплуата = новое Forexpression (this.context); } else {// Создать исходное выражение команды для выражений анализа контента = new PrimitiveExpression (this.context); }} / *** Содержимое анализа* / @@override public void roternation () {// sacksing content this.expressions.interpret (); }}4.6
пакет com.demo.interpreter.express; import com.demo.interpreter.context.context;/** * Для выражения * * @author * */public class forexpression реализует iexpressions {частный окончательный контекст контекста; // Хранить текущее значение ключа индекса частной строковой переменной; // хранить начальную позицию цикла частного int start_index; // хранить конечную позицию петли private int end_index; частные выражения iexpressions; / ** * Конструктор передает контекст, который будет проанализирован в * * @param context */ public forexpression (контекст контекста) {this.context = context; this.parse (this.context); } / *8* while (true) {// судить узел if (this.context.equalswithcommand ("from")) {// Установить строку содержимого индекса начала nextstr = this.context.next (); try {this.start_index = integer.parseint (nextstr); } catch (Exception e) {System.out .println ("Ошибка: после 'from' Expression Ошибка! Пожалуйста, проверьте формат выражения правильный!"); перерыв; } // Получить следующий узел this.context.next (); } else if (this.context.equalswithCommand ("to")) {// Установить строку содержимого индекса конечного индекса nextStr = this.context.next (); try {this.end_index = integer.parseint (nextstr); } catch (Exception e) {System.out .println ("Ошибка: после 'to' Expression Error! Пожалуйста, проверьте формат выражения правильный!"); } this.context.next (); перерыв; } else {// Установить содержимое текущей переменной индекса if (this.variable == null) {this.variable = this.context.getCurrentToken (); } // Получить следующий узел this.context.next (); }} // Создать выражение списка this.expressions = new ListExpression (); this.expressions.parse (this.context); } / *** Реализовать метод объяснения* / @Override public void rotport () {// Создать выражение команды для (int x = this.start_index; x <= this.end_index; x ++) {// Установить содержимое переменной this.context.put ("+this.variable, x); // выполнить метод объяснения this.expressions.interpret (); } // Удалить временное содержание переменной, используемое это. Context.clear (" + this.variable); }}4.7 Основные выражения - примитивная экспрессия
пакет com.demo.interpreter.express; import com.demo.interpreter.context.context;/** * Самое основное выражение * * @author * */public class primitiveExpression реализует iexpressions {контекст частного контекста; // имя узла частная строка Tokenname; // текстовый контент частный текст строки; / ** * Конструктор передает контекст, который будет проанализирован в * * @param context */ public primitiveExpression (контекст контекста) {this.parse (context); } @Override public void parse (контекст контекста) {this.context = context; this.tokenname = this.context.getCurrentToken (); this.context.next (); if ("println" .equals (this.tokenname)) {this.text = this.context.getCurrentToken (); this.context.next (); }} / *** Метод объяснения реализации* / @Override public void roternt () {// сначала получить текущее содержание узла if ("println" .equals (tokenname)) {// Получить информацию о контенте // print content System.out.println (this.context.gettokencontent (this.text)); }}}4.8 Пусть интерпретатор языка начнет работать - клиент
пакет com.demo.interpreter; import com.demo.interpreter.express.iexpressions; import com.demo.interpreter.express.programexpression;/** * Основное приложение * * @author * */public clus До 100 println i end println end ... end "; System.out.println ("str:" + str); // Создать программное выражение iexpressions expressions = new ProgramexPression (str); // объяснить выполнение Expressions.Interpret (); }}5 Результаты работы
Str: Program Println Start ... для I от 90 до 100 println I End Println End ... End
Начинать...
90
91
92
93
94
95
96
97
98
99
100
конец...
Три принципа дизайна
1 Принцип «открытый»
2 Принцип закрытого изменения
Четыре случая использования
(1) Определенный тип проблемы возникает на высокой частоте, и бизнес -правила часто меняются, и аналогичные ситуации возникают неоднократно.
(2) Бизнес -правила не слишком сложны и громоздки, и легче абстрагировать грамматические правила.
(3) Эффективность не является основным фактором, рассматриваемым в программных системах.
Статическая диаграмма режима пять интерпретаторов статической классы
Для получения дополнительного контента, связанного с Java, читатели, заинтересованные в этом сайте, могут просмотреть темы: «Введение и расширенное учебное пособие по объектно-ориентированному программам Java», «Учебное пособие по структуре данных Java и алгоритм», «Суммарной навыки Java Dom Node», «Суммируют навыки работы навыков операции Java File File и Directory» и «Summary of Java CACEE CACEE».
Я надеюсь, что эта статья будет полезна для всех Java Programming.