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.0122 sec