E D R , A S I H C RSS

Tdd Recursive Descent Parsing

RecursiveDescentParsing ์„ TFP ๋กœ ์‹œ๋„๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•˜๋Š”๋ฐ.. Parser๋ถ€๋ถ„์— ๋Œ€ํ•œ test ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” AST๋ฅผ ์–ป๋„๋ก ํ•ด์•ผ ํ•˜๊ณ , AST๋ฅผ ์กฐ๊ธˆ์”ฉ ๊ตฌ์ถ•ํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋””์ž์ธ์œ ๋„์ค‘์ธ๋ฐ. ์ด ์•„์ด๋””์–ด ์ƒ๊ฐํ•˜๋ ค๋Š”๋ฐ 1์‹œ๊ฐ„์„ ์†Œ๋น„ํ–ˆ๋‹ค. ํก;

๋จผ์ € "1"์„ ๋„ฃ์œผ๋ฉด "1"์„ ๋ฆฌํ„ดํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‹ค์Œ "314"๋ฅผ ๋„ฃ์œผ๋ฉด "314"๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์—”, "1 + 0"์„ ๋„ฃ์œผ๋ฉด "1"์„ ๋ฆฌํ„ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ, "1 + 314"๋ฅผ ๋„ฃ์œผ๋ฉด "315"๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ, "1 + 2 + 314"๋ฅผ ํ•˜๋ฉด "317"์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ, "1 - 0"์„ ํ•˜๋ฉด "1"์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ, "1 - 1"์„ ํ•˜๋ฉด "0"์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ, "314 - 1 + 2"๋ฅผ ํ•˜๋ฉด "315"๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ, "- 1"์„ ๋„ฃ์œผ๋ฉด "-1"์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ, "( 1 )"์„ ๋„ฃ์œผ๋ฉด "1"์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ...... AST๋Š” ์•„์ง ์ƒ๊ฐํ•˜์ง€ ๋ง๊ณ  ๋‹น์žฅ ํ˜„์žฌ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ํŒจ์Šคํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”๋ฐ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ€๊ณ  OAOO๋ฅผ ์ง€ํ‚ค๋ฉด์„œ(ํ…Œ์ŠคํŠธ์ฝ”๋“œ์™€ ์‹œ์Šคํ…œ์ฝ”๋“œ ์‚ฌ์ด, ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šคํ…œ ์ฝ”๋“œ ๊ฐ„) ๋ฆฌํŒฉํ† ๋ง์„ ์ง€์†์ ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค -- ๊ทธ๋ ‡๋‹ค๊ณ  ํŒŒ์‹ฑ ์ด๋ก ์„ ์ „ํ˜€ ์ด์šฉํ•˜์ง€ ๋ง๋ผ๋Š” ๋ง์€ ์•„๋‹ˆ๊ณ  YAGNI๋ฅผ ๋ช…์‹ฌํ•˜๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–ด๋А ๋ˆ„๊ฐ€ ๋ด๋„ ํ›Œ๋ฅญํ•œ ๋””์ž์ธ์˜ ํŒŒ์„œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DoTheSimplestThingThatCouldPossiblyWork. --๊น€์ฐฝ์ค€
  • ์•„. ์ด๋ฒˆ ๋ ˆํฌํŠธ์—์„œ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๊ณ„์‚ฐ๊ธฐ๋Š” ์•„๋‹ˆ๊ณ , ๊ฐ„๋‹จํ•œ ์–ธ์–ด์— ๋Œ€ํ•œ ํŒŒ์‹ฑ ์œ ๋„๊ณผ์ •์„ ๋ณด์—ฌ์ฃผ๊ณ  ์—๋Ÿฌ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค๋ณด๋‹ˆ, ๊ตฌ์ฒด์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๋ถ€๋ถ„์ด ๋ชจํ˜ธํ•˜๋‹ค ํŒ๋‹จ์ด ๋“ค์–ด์„œ์š”. ๊ทธ๋ž˜์„œ ์กฐ๊ธˆ ๋” ๋ช…์‹œ์ ์œผ๋กœ ๋ณด์ด๋Š” DOM ํ˜•ํƒœ์˜ AST๋ฅผ ๊ตฌํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ ‘๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค. --์„์ฒœ

๋Œ€๊ฐ• ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ๊ณ ์š”. ํ…Œ์ŠคํŠธ์ฝ”๋“œ 2-3์ค„์“ฐ๊ณ  ํŒŒ์„œ ๋ฉ”์ธ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ณ  ํ•˜๋Š” ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค. (Refactoring ์„ ํ•˜๋‹ค๋ณด๋ฉด FactoryMethodPattern ๊ณผ CompositePattern ์ด ์ ์šฉ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ, ์•„์ง์€ ์ผ๋‹จ.)

๋ฌธ์ œ์  : ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋‚˜์˜ค๊ธฐ๊นŒ์ง€๊ฐ€ ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค. ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ ‘๊ทผํ•˜๊ณ  ๋‚˜์„œ๋ถ€ํ„ฐ์˜ ์ฝ”๋”ฉ์€ 1-1.5์‹œ๊ฐ„์ •๋„๋ฐ–์— ์•ˆ๊ฑธ๋ ธ์ง€๋งŒ. ๊ทธ๋ฆฌ๊ณ  ๋ณธ๋ž˜์˜ ์ŠคํŽ™์—๋Š” AST ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ์—†์—ˆ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์ œ๋Œ€๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€๋ฅผ ๊ทผ๊ฑฐ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์•˜์„์ง€๋„.

~cpp 
parser = RealParser()
	parser.setStringStream("a = b+c")
	doc = parser.parse()
	self.assert_(doc != None)
	
	# ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ• ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

	start = doc.getStart()
	self.assert_(start != None)

	# ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ• ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
	
	statements = start.getStatements()
	self.assert_(statements != None)

	# ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ• ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

	statement = statements.getStatement()
	self.assert_(statement != None)

	# ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ• ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

	identifier = statement.getIdentifier()
	token = identifier.getToken()
	self.assertEquals(token.tokenString, 'a')
	self.assertEquals(token.tokenType, Scanner.TOKEN_IDENTIFIER)

	# ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ• ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

	assignment_operator = statement.getAssignmentOperator()
	token = assignment_operator.getToken()
	self.assertEquals(token.tokenString, '=')
	self.assertEquals(token.tokenType, Scanner.TOKEN_ASSIGNMENT_OPERATOR)

	# ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ• ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

	expression = statement.getExpression()
	self.assert_(expression != None)

	# ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ• ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

	term = expression.getTerm()
	self.assert_(term != None)

	# ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ• ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

	factor = term.getFactor()
	self.assert_(factor != None)

	# ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ• ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

	identifier = factor.getIdentifier()
	self.assert_(identifier != None)

	# ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ• ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
	
	token = identifier.getToken()
	self.assertEquals(token.tokenString,'b')
	self.assertEquals(token.tokenType, Scanner.TOKEN_IDENTIFIER)

	# ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ• ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

	plus_operator = expression.getPlusOperator()
	token = plus_operator.getToken()
	self.assertEquals(token.tokenString, '+')
	self.assertEquals(token.tokenType, Scanner.TOKEN_PLUS_OPERATOR)

	# ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ• ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:10
Processing time 0.0049 sec