{"id":10532,"date":"2020-10-24T09:50:47","date_gmt":"2020-10-24T00:50:47","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=10532"},"modified":"2020-10-25T09:19:36","modified_gmt":"2020-10-25T00:19:36","slug":"interpreter-%ed%8c%a8%ed%84%b4","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=10532","title":{"rendered":"[GoF] Interpreter \ud328\ud134"},"content":{"rendered":"<h4>\ud328\ud134\uba85\uce6d<\/h4>\n<p>Interpreter<\/p>\n<h4>\ud544\uc694\ud55c \uc0c1\ud669<\/h4>\n<p>\ud504\ub85c\uadf8\ub7a8\uc758 \uc2e4\ud589 \uc0c1\ud669\uc744 \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4\ub97c \uc9c0\uc6d0\ud560 \uc218 \uc788\ub294 \ud328\ud134\uc774\ub2e4.<\/p>\n<h4>\uc608\uc81c \ucf54\ub4dc<\/h4>\n<p><img decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2020\/10\/interpreter.png\" alt=\"\" width=\"1000\" class=\"aligncenter size-full wp-image-10533\" \/><\/p>\n<p>\uc5b4\ub5a4 \uac1d\uccb4\ub97c \uc0c1(Front), \ud558(Back), \uc88c(Left), \uc6b0(Right)\ub85c \uc774\ub3d9\uc2dc\ud0a4\ub294 \uba85\ub839\uc5b4\ub85c\uc368 \uac01\uac01 FRONT, BACK, LEFT, RIGHT\ub97c \uc0ac\uc6a9\ud558\uace0 \uc774\ub7ec\ud55c \uba85\ub839\uc5b4\ub4e4\uc758 \uc870\ud569\uc744 \ubc18\ubcf5\ud560 \uc218 \uc788\ub294 LOOP \uba85\ub839\uc5b4\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4\ub97c \ud574\uc11d\ud558\uae30 \uc704\ud55c \uc608\uc81c\uc774\ub2e4. Context\ub294 \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \ub300\ud55c \ubb38\uc790\uc5f4\uc744 \ubc1b\uc544 \ucc98\ub9ac\ud558\ub294 \ud074\ub798\uc2a4\uc774\uace0, Expression\uc740 \uba85\ub839\uc5b4\ub4e4\uc758 \ud574\uc11d\ud558\uace0 \ucc98\ub9ac\ud558\uae30 \uc704\ud55c \ud074\ub798\uc2a4\ub4e4\uc774 \uad6c\ud604\ud574\uc57c \ud558\ub294 \uc778\ud130\ud398\uc774\uc2a4\uc774\ub2e4. \uba3c\uc800 Context \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\nimport java.util.StringTokenizer;\r\n\r\npublic class Context {\r\n\tprivate StringTokenizer tokenizer;\r\n\tprivate String currentKeyword;\r\n\r\n\tpublic Context(String script) {\r\n\t\ttokenizer = new StringTokenizer(script);\r\n\t\treadNextKeyword();\r\n\t}\r\n\r\n\tpublic String readNextKeyword() {\r\n\t\tif(tokenizer.hasMoreTokens()) {\r\n\t\t\tcurrentKeyword = tokenizer.nextToken();\r\n\t\t} else {\r\n\t\t\tcurrentKeyword = null;\r\n\t\t}\r\n\t\t\r\n\t\treturn currentKeyword;\r\n\t}\r\n\t\r\n\tpublic String getCurrentKeyword() {\r\n\t\treturn currentKeyword;\r\n\t}\r\n}\r\n<\/pre>\n<p>Expression \uc778\ud130\ud398\uc774\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic interface Expression {\r\n\tboolean parse(Context context);\r\n\tboolean run();\r\n}\r\n<\/pre>\n<p>parse \ub9e4\uc11c\ub4dc\ub294 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ud574\uc11d\ud558\uace0, run\uc740 \ud574\uc11d\ub41c \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc2e4\uc81c\ub85c \uc2e4\ud589\ud558\ub294 \ub9e4\uc11c\ub4dc\uc774\ub2e4. \uc2a4\ud06c\ub9bd\ud2b8\uc758 \uc608\uc81c\ub85c \ub2e4\uc74c \ubb38\uc790\uc5f4\uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n<pre class='code'>\r\nBEGIN FRONT LOOP 3 LOOP 2 RIGHT FRONT END LOOP 3 LEFT END BACK RIGHT END BACK END\r\n<\/pre>\n<p>\uc2a4\ud06c\ub9bd\ud2b8\ub294 BEGIN\uc73c\ub85c \uc2dc\uc791\ud574\uc11c END\ub85c \ub05d\ub098\uba70, \ubc18\ubcf5\ubb38\uc778 LOOP\ub294 \ubc18\ubcf5 \ud68c\uc218\ub85c \uc2dc\uc791\ud574\uc11c \ubc18\ubcf5\ud560 \uba85\ub839\uc5b4\ub4e4\ub85c \uad6c\uc131\ub418\uace0 END\ub85c \ub05d\ub09c\ub2e4.<\/p>\n<p>Expression \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\ub4e4\uc744 \uc0b4\ud3b4\ubcf4\uc790. \uba3c\uc800 \uc2a4\ud06c\ub9bd\ud2b8\uc758 \uc2dc\uc791\uc744 \ud574\uc11d\ud558\ub294 BeginExpression\uc774\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class BeginExpression implements Expression {\r\n\tprivate CommandListExpression expression;\r\n\r\n\t@Override\r\n\tpublic boolean parse(Context context) {\r\n\t\tif(checkValidKeyword(context.getCurrentKeyword())) {\r\n\t\t\tcontext.readNextKeyword();\r\n\t\t\texpression = new CommandListExpression();\r\n\t\t\treturn expression.parse(context);\r\n\t\t} else {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic String toString() {\r\n\t\treturn \"BEGIN \" + expression; \r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean run() {\r\n\t\treturn expression.run();\r\n\t}\r\n\r\n\tpublic static boolean checkValidKeyword(String keyword) {\r\n\t\treturn keyword.equals(\"BEGIN\");\r\n\t}\r\n}\r\n<\/pre>\n<p>\ub2e4\uc74c\uc740 CommandListExpression \uc774\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Iterator;\r\n\r\npublic class CommandListExpression implements Expression {\r\n\tprivate ArrayList&lt;CommandExpression> commands = new ArrayList&lt;CommandExpression>();\r\n\t\r\n\t@Override\r\n\tpublic boolean parse(Context context) {\r\n\t\twhile(true) {\r\n\t\t\tString currentKeyword = context.getCurrentKeyword();\r\n\t\t\tif(currentKeyword == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t} else if(currentKeyword.equals(\"END\")) {\r\n\t\t\t\tcontext.readNextKeyword();\r\n\t\t\t\tbreak;\r\n\t\t\t} else {\r\n\t\t\t\tCommandExpression command = null;\r\n\t\t\t\t\r\n\t\t\t\tif(LoopCommandExpression.checkValidKeyword(currentKeyword)) {\r\n\t\t\t\t\tcommand = new LoopCommandExpression(currentKeyword);\r\n\t\t\t\t} else if(ActionCommandExpression.checkValidKeyword(currentKeyword)) {\r\n\t\t\t\t\tcommand = new ActionCommandExpression(currentKeyword);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif(command != null) {\r\n\t\t\t\t\tif(command.parse(context)) {\r\n\t\t\t\t\t\tcommands.add(command);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpublic String toString() {\r\n\t\treturn commands.toString();\r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean run() {\r\n\t\tIterator&lt;CommandExpression> iter = commands.iterator();\r\n\t\t\r\n\t\twhile(iter.hasNext()) {\r\n\t\t\tboolean bOK = iter.next().run();\r\n\t\t\tif(!bOK) return false;\r\n\t\t}\r\n\t\t\r\n\t\treturn true;\r\n\t}\r\n}\r\n<\/pre>\n<p>CommandListExpression\uc740 \uc2e4\uc81c \uc2e4\ud589\uc774 \uac00\ub2a5\ud55c LOOP\ub098 FRONT, BACK, RIGHT, LEFT \uba85\ub839\uc5b4\ub97c \ub2f4\uc744 \ub2f4\uc744 \uc218 \uc788\ub294 CommandExpression\uc758 \ud30c\uc0dd\ud074\ub798\uc2a4\ub97c \uc0dd\uc131\ud574 \uc8fc\ub294 \ucc45\uc784\uc744 \uc9c4\ub2e4. CommandExpression\uc758 \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic abstract class CommandExpression implements Expression {\r\n\tprotected String keyword;\r\n\t\r\n\tpublic CommandExpression(String keyword) {\r\n\t\tthis.keyword = keyword;\r\n\t}\r\n}\r\n<\/pre>\n<p>CommandExpression \ucd94\uc0c1 \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ubc1b\ub294 \ud074\ub798\uc2a4\ub4e4\uc744 \uc0b4\ud3b4\ubcf4\uc790. \uba3c\uc800 LoopCommandExpression \ud074\ub798\uc2a4\uc774\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class LoopCommandExpression extends CommandExpression {\r\n\tprivate int count;\r\n\tprivate CommandListExpression expression;\r\n\t\r\n\t\r\n\tpublic LoopCommandExpression(String keyword) {\r\n\t\tsuper(keyword);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean parse(Context context) {\r\n\t\tif(!checkValidKeyword(keyword)) return false; \r\n\t\t\r\n\t\tString countKeyword = context.readNextKeyword();\r\n\t\tif(countKeyword == null) return false;\r\n\t\t\r\n\t\ttry {\r\n\t\t\tcount = Integer.parseInt(countKeyword);\r\n\t\t\texpression = new CommandListExpression();\r\n\t\t\t\r\n\t\t\tif(context.readNextKeyword() == null) return false;\r\n\t\t\t\r\n\t\t\treturn expression.parse(context);\r\n\t\t} catch(NumberFormatException e) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic String toString() {\r\n\t\treturn \"LOOP(\" + count + \") \" + expression;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean run() {\r\n\t\tfor(int i=0; i&lt;count; i++) {\r\n\t\t\tif(!expression.run()) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static boolean checkValidKeyword(String keyword) {\r\n\t\treturn keyword.equals(\"LOOP\");\r\n\t}\r\n}\r\n<\/pre>\n<p>\ub2e4\uc74c\uc740 ActionCommandExpression \ud074\ub798\uc2a4\uc774\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class ActionCommandExpression extends CommandExpression {\r\n\tpublic ActionCommandExpression(String keyword) {\r\n\t\tsuper(keyword);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean parse(Context context) {\r\n\t\tif(!checkValidKeyword(keyword)) return false;\r\n\t\tif(context.readNextKeyword() == null) return false;\r\n\t\t\t\t\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic String toString() {\r\n\t\treturn keyword;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean run() {\r\n\t\tSystem.out.println(\"cmd: \" + keyword);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpublic static boolean checkValidKeyword(String keyword) {\r\n\t\tboolean bKeywordOk = keyword.equals(\"FRONT\") || \r\n\t\t\t\tkeyword.equals(\"BACK\") || keyword.equals(\"LEFT\") || \r\n\t\t\t\tkeyword.equals(\"RIGHT\");\r\n\t\t\r\n\t\treturn bKeywordOk;\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc9c0\uae08\uae4c\uc9c0\uc758 \ud074\ub798\uc2a4\ub4e4\uc744 \uc0ac\uc6a9\ud558\ub294 \uc608\uc81c\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class Main {\r\n\tpublic static void main(String[] args) {\r\n\t\t\/\/String script = \"BEGIN FRONT LOOP 2 RIGHT FRONT LEFT LEFT BACK RIGHT END BACK END\";\r\n\t\t\/\/String script = \"BEGIN FRONT LOOP 2 RIGHT FRONT LOOP 3 LEFT LEFT END BACK RIGHT END BACK END\";\r\n\t\tString script = \"BEGIN FRONT LOOP 3 LOOP 2 RIGHT FRONT END LOOP 3 LEFT END BACK RIGHT END BACK END\";\r\n\t\tContext context = new Context(script);\r\n\t\tExpression expression = new BeginExpression();\r\n\t\t\r\n\t\tSystem.out.println(script);\r\n\t\tif(expression.parse(context)) {\r\n\t\t\tSystem.out.println(expression);\r\n\t\t\texpression.run();\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"Parsing error\");\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc2e4\ud589 \uacb0\uacfc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<p><code class='code'><br \/>\nBEGIN FRONT LOOP 3 LOOP 2 RIGHT FRONT END LOOP 3 LEFT END BACK RIGHT END BACK END<br \/>\nBEGIN [FRONT, LOOP(3) [LOOP(2) [RIGHT, FRONT], LOOP(3) [LEFT], BACK, RIGHT], BACK]<br \/>\ncmd: FRONT<br \/>\ncmd: RIGHT<br \/>\ncmd: FRONT<br \/>\ncmd: RIGHT<br \/>\ncmd: FRONT<br \/>\ncmd: LEFT<br \/>\ncmd: LEFT<br \/>\ncmd: LEFT<br \/>\ncmd: BACK<br \/>\ncmd: RIGHT<br \/>\ncmd: RIGHT<br \/>\ncmd: FRONT<br \/>\ncmd: RIGHT<br \/>\ncmd: FRONT<br \/>\ncmd: LEFT<br \/>\ncmd: LEFT<br \/>\ncmd: LEFT<br \/>\ncmd: BACK<br \/>\ncmd: RIGHT<br \/>\ncmd: RIGHT<br \/>\ncmd: FRONT<br \/>\ncmd: RIGHT<br \/>\ncmd: FRONT<br \/>\ncmd: LEFT<br \/>\ncmd: LEFT<br \/>\ncmd: LEFT<br \/>\ncmd: BACK<br \/>\ncmd: RIGHT<br \/>\ncmd: BACK<br \/>\n<\/code><\/p>\n<div style='background:#efefef;border-radius:8px;padding:12px 24px'>\uc774 \uae00\uc740 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc124\uacc4\uc758 \uae30\ubc18\uc774 \ub418\ub294 GoF\uc758 \ub514\uc790\uc778\ud328\ud134\uc5d0 \ub300\ud55c \uac15\uc758\uc790\ub8cc\uc785\ub2c8\ub2e4. \uc644\uc804\ud55c \uc2e4\uc2b5\uc744 \uc704\ud574 \uc774 \uae00\uc5d0\uc11c \uc18c\uac1c\ud558\ub294 \ud074\ub798\uc2a4 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uacfc \uc608\uc81c \ucf54\ub4dc\ub294 \uc644\uc804\ud558\uac8c \uc2e4\ud589\ub418\ub3c4\ub85d \uc81c\uacf5\ub418\uc9c0\ub9cc, \uc0c1\ub300\uc801\uc73c\ub85c \uc608\uc81c \ucf54\ub4dc\uc640 \uad00\ub828\ub41c \uc124\uba85\uc774 \ud568\ucd95\uc801\uc73c\ub85c \uc81c\uacf5\ub418\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0 \ub300\ud574 \uad81\uae08\ud55c \uc810\uc774 \uc788\uc73c\uba74 \ub313\uae00\uc744 \ud1b5\ud574 \ub0a8\uaca8\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\ud328\ud134\uba85\uce6d Interpreter \ud544\uc694\ud55c \uc0c1\ud669 \ud504\ub85c\uadf8\ub7a8\uc758 \uc2e4\ud589 \uc0c1\ud669\uc744 \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4\ub97c \uc9c0\uc6d0\ud560 \uc218 \uc788\ub294 \ud328\ud134\uc774\ub2e4. \uc608\uc81c \ucf54\ub4dc \uc5b4\ub5a4 \uac1d\uccb4\ub97c \uc0c1(Front), \ud558(Back), \uc88c(Left), \uc6b0(Right)\ub85c \uc774\ub3d9\uc2dc\ud0a4\ub294 \uba85\ub839\uc5b4\ub85c\uc368 \uac01\uac01 FRONT, BACK, LEFT, RIGHT\ub97c \uc0ac\uc6a9\ud558\uace0 \uc774\ub7ec\ud55c \uba85\ub839\uc5b4\ub4e4\uc758 \uc870\ud569\uc744 \ubc18\ubcf5\ud560 \uc218 \uc788\ub294 LOOP \uba85\ub839\uc5b4\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4\ub97c \ud574\uc11d\ud558\uae30 \uc704\ud55c \uc608\uc81c\uc774\ub2e4. Context\ub294 \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \ub300\ud55c \ubb38\uc790\uc5f4\uc744 \ubc1b\uc544 \ucc98\ub9ac\ud558\ub294 \ud074\ub798\uc2a4\uc774\uace0, &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=10532\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;[GoF] Interpreter \ud328\ud134&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-10532","post","type-post","status-publish","format-standard","hentry","category-design"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10532","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10532"}],"version-history":[{"count":8,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10532\/revisions"}],"predecessor-version":[{"id":10551,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10532\/revisions\/10551"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10532"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}