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๋ฅผ ๊ตฌํ๋ ํํ๋ก ์ ๊ทผํ์ต๋๋ค. --์์ฒ
๋ฌธ์ ์ : ํ
์คํธ ๊ฐ๋ฅํ ์ ์๋ ์์ด๋์ด๊ฐ ๋์ค๊ธฐ๊น์ง๊ฐ ์ค๋๊ฑธ๋ ธ๋ค. ํ
์คํธ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํ๊ณ ๋์๋ถํฐ์ ์ฝ๋ฉ์ 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) # ์ด ํ ์คํธ๋ฅผ ๋ง์กฑํ ๋๊น์ง ํ๋ก๊ทธ๋๋ฐ