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