이 기사에서는 통역사 패턴을 기반으로 간단한 언어 함수를 정의하기위한 Java의 구현에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
패턴 정의
통역 패턴 : 언어를 문법적으로 표현하고 언어로 문장을 해석하기 위해 통역사를 정의하는 것입니다. 통역사 패턴은 간단한 문법 후 패턴 디자인을 사용하여 이러한 진술을 해석하는 방법을 설명합니다.
두 번째 모드의 예
1 패턴 분석
우리는이 패턴을 스스로 설명하기 위해 언어를 설계했습니다
(1) 언어는 사례에 민감합니다 (2) 언어는 프로그램으로 시작하여 끝으로 끝납니다.
언어 내용 예제는 다음과 같습니다.
프로그램 println 시작 ... 90 ~ 100 println i end println end ... 끝
이 문장의 의미는 다음과 같습니다. 먼저 "Start ..."로 줄 바꿈을 인쇄 한 다음 "90", "91", ... "100"으로 줄 바꿈을 순환하고 마지막으로 "End ..."로 줄 바꿈을 인쇄합니다.
2이 언어는 나무 구조를 설명합니다
3 언어 통역사의 활동 다이어그램
4 코드 예제
4.1 컨텍스트 환경 생성 - 컨텍스트
package com.demo.interpreter.context; import java.util.hashmap; import java.util.iterator; import java.util.map; import java.util.stringtokenizer;/** * 컨텍스트 환경 * * @author */public class context {// 텍스트 콘텐츠를 곡면 최종 문자열로 묶어야합니다. // 현재 명령 개인 문자열 currentToken; // 동적으로 변화하는 정보를 저장하는 데 사용되는 정보 콘텐츠 개인 최종지도 <문자열, 개체>지도 = new Hashmap <String, Object> (); / ** * 생성자는 콘텐츠를 구문 분석 설정 * * @param text */ public context (문자열 텍스트) {// 텍스트를 분리하여 구문 분석 할 텍스트를 분리합니다. } / *** 텍스트를 구문 분석* / public string next () {if (this.stringtokenizer.hasmoretokens ()) {currentToken = this.stringTokenizer.nextToken (); } else {currentToken = null; } currentToken을 반환합니다. } / ** * 명령이 올바른지 여부를 결정하십시오 * * @param command * @return * / public boolean equitswithCommand (string command) {if (command == null ||! command.equals (this.currentToken)) {return false; } true를 반환합니다. } / ** * 현재 명령 내용을 가져옵니다 * * @return * / public String getCurrentToken () {return this.currentToken; } / ** * 노드의 내용을 가져옵니다 * * @return * / public String getTokenContent (문자열 텍스트) {String str = 텍스트; if (str! = null) {// 맵에서 동적으로 변화하는 콘텐츠를 교체하고 반환 iterator <string> // 맵에서 동적으로 변경된 컨텐츠를 교체하고 반환 반복자 <string> iterator = this.map.keyset (). iterator (); while (iterator.hasnext ()) {String key = iterator.next (); Object obj = map.get (키); str = str.replaceall (key, obj.tostring ()); }} return str; } public void put (문자열 키, 객체 값) {this.map.put (키, 값); } public void clear (문자열 키) {this.map.remove (키); }}4.2 발현 인터페이스 - Ixpressions
package com.demo.interpreter.express; import com.demo.interpreter.context.context;/** * * expression interface * * @author */public interface ixpressions {/** * Parsing */public void parse (context context); / ** * 실행 방법 * * @param 컨텍스트 */ public void induge ();}4.3 주요 표현 - Programexpression
package com.demo.interpreter.express; import com.demo.interpreter.context.context;/** * 프로그램 표현 * * @author */public class programexpression implements itepressions {// 컨텍스트 환경 개인 최종 컨텍스트 컨텍스트; // 현재 명령 개인 최종 정적 문자열 명령 = "프로그램"; // 다음 표현식 참조 개인 IEXPRESSIONS 표현식을 저장합니다. / ** * 생성자는 * * @param text */ public programexpression (String text) {this.context = new Context (Text); this.parse (this.context); } @override public void parse (context context) {// 첫 번째 명령 노드를 가져옵니다 .context.next (); } / *** 구현 설명 메소드* / @override public void Indust () {// 프로그램으로 시작하는지 여부를 결정합니다. } else {// 프로그램이있는 this.context.next (); this.expressions = new ListExpression (); this.expressions.parse (this.context); // Listexpression 표현식은 this.expressions.interpret ()를 구문 분석하기 시작합니다. }}}4.4 목록 표현 - ListExpression
package com.demo.interpreter.express; import java.util.arraylist; import java.util.iterator; import com.demo.interpreter.context.context;/** * 목록 표현 * * @author */public class listexpression emperments {private context 컨텍스트; Private Final ArrayList <Iexpressions> list = new ArrayList <Iexpressions> (); / ** * 생성자는 컨텍스트를 전달하여 * * @param 컨텍스트 */ public void parse (컨텍스트 컨텍스트) {this.context = context; // listexpression parsing expression에서, 터미네이터 표현식 또는 예외가 종료 될 때까지 (true) {if (this.context.getCurrentToken () == null) {// 현재 노드를 얻습니다. null이라면 끝 표현식에 System.out.println이 누락되었음을 의미합니다 ( "오류 : Expersion Mass 'End'!"); 부서지다; } else if (this.context.equalswithCommand ( "end")) {this.context.next (); // 구문 분석은 일반적으로 종료됩니다. } else {// 명령 expression expressions expressions = new CommandExpersion (this.context); // list.add (expressions)에 추가합니다. }}} / *** 구현 설명 방법* / @override public void Indust () {//리스트 목록에서 각 표현식의 설명을 반복 <expressions> iterator = list.iterator (); while (iterator.hasnext ()) {(iterator.next ()). 해석 (); }}}4.5 명령 표현식 - CommandExpersion
package com.demo.interpreter.express; import com.demo.interpreter.context.context;/** * 명령 표현 * * @author */public class commandexpersion empless {private final 컨텍스트 컨텍스트; 개인 IEXPRESSIONS 표현; / ** * 구성 메소드는 * * @param 컨텍스트 */ public commandexperssion (context context) {this.context = context; this.parse (this.context); } public void parse (context context) {// 현재 명령 범주를 판단하고, 원래 명령 만 구별하고 (this.context.equalswithCommand ( "for")) {// 구문 분석을위한 표현식을 위해 생성 = 새로운 외발 (this.context); } else {// 콘텐츠 구문 분석에 대한 원래 명령 표현식 생성 = 새로운 원시 표현식 (this.context); }} / *** 컨텐츠를 구문 분석* / @override public void Indust () {// 컨텐츠를 구문 분석 this.expressions.interpret (); }}4.6 루프 발현 - 외 발현
package com.demo.interpreter.express; expression for * @author */public class expression empless {private final context context; // 현재 인덱스 키 값 개인 문자열 변수 저장; // 루프의 시작 위치를 저장 개인 int start_index; // 루프의 끝 위치를 저장 개인 int end_index; 개인 IEXPRESSIONS 표현; / ** * 생성자는 컨텍스트를 전달하여 * * @param 컨텍스트 */ public forexpression (컨텍스트 컨텍스트) {this.context = context; this.parse (this.context); } / *** parsing expression* / @override public void parse (context context) {// 먼저 현재 노드를 가져옵니다 .context.next (); while (true) {// if (this.context.equalswithCommand ( "from")) {// 시작 색인 내용 문자열 nextstr = this.context.next (); try {this.start_index = integer.parseint (nextstr); } catch (예외 e) {system.out .println ( "Error : 'ours'restrement Eversion error! 표현식 형식이 올바른지 확인하십시오!"); 부서지다; } // 다음 노드를 가져옵니다 .context.next (); } else if (this.context.equalswithCommand ( "to")) {// 끝 인덱스 내용을 설정하십시오. try {this.end_index = integer.parseint (nextstr); } catch (예외 e) {system.out .println ( "Error : 'to'expression Eversion error! 표현식 형식이 올바른지 확인하십시오!"); } this.context.next (); 부서지다; } else {// 현재 인덱스 변수의 내용을 설정합니다. } // 다음 노드를 가져옵니다 .context.next (); }} // 목록 표현식 생성 this.expressions = new ListExpression (); this.expressions.parse (this.context); } / *** 설명 메소드 구현* / @override public void Indust () {// (int x = this.start_index; x <= this.end_index; x ++)에 대한 명령 표현식을 만듭니다. // 설명 메소드를 실행합니다. } // 사용 된 임시 변수 컨텐츠를 제거하십시오 .context.clear ( "" + this.variable); }}4.7 기본 표현 - 원시 표현
package com.demo.interpreter.express; import com.demo.interpreter.context.context;/** * 가장 기본적인 표현 * * @author */public class primitiveexpression implements expressions {private context context; // 노드 이름 개인 문자열 토 케 이름; // 텍스트 내용 개인 문자열 텍스트; / ** * 생성자는 컨텍스트를 전달하여 * * @param 컨텍스트 */ public primiveexpression (컨텍스트 컨텍스트) {this.parse (컨텍스트); } @override public void parse (context context) {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 Induge () {// 먼저 현재 노드 컨텐츠를 가져옵니다. }}}4.8 언어 통역사가 작동하기 시작하십시오 - 클라이언트
package com.demo.interpreter; import com.demo.interpreter.express.iexpress.ixpress.ixpress.ipramexpression;/** * 메인 애플리케이션 * * @author */public class client {/** * @param args */public static void main (string [] args) {// myida ancial str = " 100 println i end println end ... end "; System.out.println ( "str :" + str); // 프로그램 표현식 만들기 IXPRESSIONS expressions = new ProgrameXpression (str); // expressions.interpret ()의 실행을 설명합니다. }}5 실행 결과
str : program println start ... I for i 90 ~ 100 println i end println end ... 끝
시작...
90
91
92
93
94
95
96
97
98
99
100
끝...
세 가지 디자인 원칙
1 "개방형"원칙
2 닫힌 변화의 원리
4 개의 사용법
(1) 특정 유형의 문제는 높은 빈도에서 발생하며 비즈니스 규칙이 자주 변경되며 비슷한 상황이 반복적으로 발생합니다.
(2) 비즈니스 규칙은 너무 복잡하고 번거롭지 않으며 문법 규칙을 추상화하는 것이 더 쉽습니다.
(3) 효율성은 소프트웨어 시스템에서 고려되는 주요 요인이 아닙니다.
5 개의 통역 모드 정적 클래스 다이어그램
더 많은 Java 관련 컨텐츠를 위해이 사이트에 관심이있는 독자는 "Java 객체 지향 프로그래밍에 대한 소개 및 고급 튜토리얼", "Java 데이터 구조 및 알고리즘에 대한 자습서", "Java Operation Dom Node Skills 요약", "Java 파일 및 디렉토리 운영 기술 요약"및 "Java Cache Cache 운영 기술 요약"을 볼 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.