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