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