- 1 ±âº» ¾ÆÀ̵ð¾î
- 2 ¾×¼Çµé¿¡ ´ëÇÑ ¾Æ±Ô¸ÕÆ®µé
- 3 dparser.Parser() ¿¡ ´ëÇÑ ¾Æ±Ô¸ÕÆ®µé
- 4 dparser.Parser.parse() ¿¡ ´ëÇÑ ¾Æ±Ô¸ÕÆ®µé
- 5 À§Çèµé(pitfalls)°ú ÆÁµé
1 ±âº» ¾ÆÀ̵ð¾î #
¹®¹ý ±ÔÄ¢Àº Python function document strings ¸¦ »ç¿ëÇÏ¿©
?DParser ¿¡ ÀԷµȴÙ.(Python function ÀÇ Ã¹¹ø° ¶óÀο¡ À§Ä¡ÇÑ string ÀÌ ±× function ÀÇ documentation string ÀÌ´Ù)
?DParser ·Î ÇÏ¿©±Ý ƯÁ¤ÇÑ function ÀÇ documentation string À» ´ç½ÅÀÇ ¹®¹ýÀÇ ÀϺκÐÀ¸·Î ÀÎÁöÇÏ°Ô ÇÏ·Á¸é, function ÀÇ À̸§À» "d_" ·Î ½ÃÀÛÇÏ°Ô ÇÏ¸é µÈ´Ù. ±×·¯¸é ±× function Àº documentation string ¿¡ Á¤ÀÇµÈ production ÀÌ ÁÙ¾îµé ¶§¸¶´Ù ½ÇÇàµÇ´Â ¾×¼Ç ÀÌ µÈ´Ù. ¿¹¸¦ µé¸é
def d_action1(t):
" sentence : noun 'runs' "
print 'found a sentence'
# ...
ÀÌ function Àº ¾×¼Ç, d_action1, °ú production, sentence, ¸¦
?DParser ¿¡°Ô ¸»ÇØÁØ´Ù.
?DParser °¡ sentence ¸¦ ÀνÄÇÒ ¶§ d_action1 Àº È£ÃâµÈ´Ù. d_action ¿¡ ´ëÇÑ ¾Æ±Ô¸ÕÆ®, t, ´Â array ´Ù. ÀÌ array ´Â production À» ±¸¼ºÇÏ´Â element µéÀÇ ¸®ÅÏ°ªµé·Î ±¸¼ºµÇ°Å³ª ¶Ç´Â terminal element µé¿¡ ´ëÇؼ´Â terminal ÀÌ ¸ÅÄ¡ÇÏ´Â string À¸·Î ±¸¼ºµÈ´Ù. À§¿¡ ¿¹¿¡¼ array t ´Â noun ÀÇ ¾×¼ÇÀ» ù¹ø° element ·Î Python string 'runs' ¸¦ µÎ¹ø° element ·Î Æ÷ÇÔÇÑ´Ù.
Á¤±ÔÇ¥Çö½ÄÀº double quotes(") ·Î µÑ·¯ ½Î¼ Ç¥ÇöÇÑ´Ù.
def d_number(t):
' number : "[0-9]+" ' # match a positive integer
return int(t[0]) # turn the matched string into an integer
# ...
´ç½ÅÀÇ documentation string ÀÌ ¸¸¾à
Python escape sequences ¸¦ Æ÷ÇÔÇÑ´Ù¸é ±×°ÍÀÌ Python raw string(r ·Î ½ÃÀÛÇÏ´Â) ÀÌ µÇµµ·Ï ÇؾßÇÑ´Ù.
¿ì¼±¼øÀ§³ª ¿¬°ü¼º °°Àº productions ÀÇ Áøº¸ÇÑ Æ¯Â¡À» ¾Ë°í ½ÍÀ¸¸é,
the DParser manual À» º¸¾Æ¶ó.
°£´ÜÇÏ°í ¿Ïº®ÇÑ µ¡¼À ¿¹Á¦´Â
home page ¸¦ º¸¾Æ¶ó.
2 ¾×¼Çµé¿¡ ´ëÇÑ ¾Æ±Ô¸ÕÆ®µé #
¸ðµç ¾×¼ÇÀº À§¿¡ ¼³¸íÇÑ Àû¾îµµ ÇϳªÀÇ array ¾Æ±Ô¸ÕÆ®¸¦ °¡Áø´Ù. ´Ù¸¥ ¾Æ±Ô¸ÕÆ®µéÀº ¼±ÅûçÇ×ÀÌ´Ù(optional).
ÀÎÅÍÆäÀ̽º´Â ´ç½ÅÀÌ ¿øÇÏ´Â ¾Æ±Ô¸ÕÆ®°¡ ¾î´À °ÍÀÎÁö ÀÎÁöÇϴµ¥ ´ç½ÅÀÌ ¾Æ±Ô¸ÕÆ®¿¡ ÁØ À̸§À» »ç¿ëÇÑ´Ù. °¡´ÉÇÑ À̸§µéÀº ¾Æ·¡¿Í °°´Ù.
3 dparser.Parser() ¿¡ ´ëÇÑ ¾Æ±Ô¸ÕÆ®µé #
¸ðµç ¾Æ±Ô¸ÕÆ®µéÀº ¼±ÅûçÇ×ÀÌ´Ù.
4 dparser.Parser.parse() ¿¡ ´ëÇÑ ¾Æ±Ô¸ÕÆ®µé #
dparser.Parser.parse ÀÇ Ã¹¹ø° ¾Æ±Ô¸ÕÆ®´Â ¾ðÁ¦³ª ÆĽÌÇÒ string ÀÌ´Ù. ´Ù¸¥ ¾Æ±Ô¸ÕÆ®µéÀº ¼±ÅûçÇ×ÀÌ´Ù.
- start_symbol
½ÃÀÛ ½Éº¼ÀÌ´Ù. default ´Â Á¦ÀÏ Ã³À½ Á¤ÀÇµÈ ½Éº¼ÀÌ´Ù.
- print_debug_info
non-zero ¸é È£ÃâµÇ´Â ¾×¼ÇµéÀÇ ¸®½ºÆ®¸¦ Ãâ·ÂÇÑ´Ù. Question mark(?) ´Â ¾×¼ÇÀÌ speculative ÀÓÀ» °¡¸®Å²´Ù.
- dont_fixup_internal_productions, dont_merge_epsilon_trees, commit_actions_interval, error_recovery
D_Parser ÀÇ ¸â¹öµé¿¡ ´ëÀÀµÈ´Ù. (
?DParser ¸Þ´º¾óÀ» º¸¾Æ¶ó)
- initial_skip_space_fn
»ç¿ëÀÚ Á¤ÀÇ °ø¹é(as does the whitespace production, and instead of the built-in, c-like whitespace parser)À» Çã¿ëÇÑ´Ù. ¾Æ±Ô¸ÕÆ®´Â d_loc_t structure ÀÌ´Ù. ÀÌ structure ÀÇ ¸â¹ö, s, ´Â ÆĽ̵ǰíÀÖ´Â string ¿¡ ´ëÇÑ index ÀÌ´Ù. °ø¹é(whitespace)À» °Ç³Ê¶Ù°í(skip) ½ÍÀ¸¸é ÀÌ index ¸¦ °íÃĶó.
def whitespace(loc): # no d_ prefix
while loc.s < len(loc.buf) and loc.buf[loc.s:loc.s+2] == ':)': # make smiley face the whitespace
loc.s = loc.s + 2
#...
Parser().parse('int:)var:)=:)2', initial_skip_space_fn = whitespace)
syntax_error_fn
syntax ¿¡·¯ ¶§ È£Ãâ. default ·Î´Â ¿¹¿Ü(exception)°¡ ¹ß»ýÇÑ´Ù. ¿¡·¯ÀÇ À§Ä¡¸¦ °¡¸®Å°´Â d_loc_t structure(initial_skip_space_fn À» º¸¾Æ¶ó) ¸¦ ³Ñ°ÜÁØ´Ù. ¾Æ·¡ ÇÔ¼ö´Â '<--error' ¿Í ¿¡·¯ À§Ä¡ÀÇ line break ¸¦ Ãâ·ÂÇÑ´Ù.
def syntax_error(loc):
mn = max(loc.s - 10, 0)
mx = min(loc.s + 10, len(loc.buf))
begin = loc.buf[mn:loc.s]
end = loc.buf[loc.s:mx]
space = ' '*len(begin)
print begin + '\n' + space + '<--error' + '\n' + space + end
ambiguity_fn:
¸ðÈ£¼ºÀ» ÇØ°áÇÑ´Ù. D_
?ParseNode ÀÇ array ¸¦ ÃëÇÑ´Ù.(´Ù½Ã
¿©±â ¸¦ º¸¶ó) ±×¸®°í ±×µé Áß Çϳª°¡ ¸®ÅϵDZ⸦ ±â´ëÇÑ´Ù. default ·Î´Â dparser.
?AmbiguityException ÀÌ ¹ß»ýÇÑ´Ù.
5 À§Çèµé(pitfalls)°ú ÆÁµé #
¸¸ÀÏ ´ç½ÅÀÌ pitfall ¿¡ ºüÁö°Å³ª ÆÁÀ» ¾Ë°í ÀÖ´Ù¸é ³»°Ô ¾Ë·Á´Þ¶ó. 'o'/ ¿©±â¿¡ Ãß°¡ÇÏ°Ú´Ù.
def d_whitespace(t):
'whitespace : "[ \t\n]*" ' # treat space, tab and newline as whitespace, but treat the # character normally
print 'found whitespace:' + t[0]
?DParser specifiers/declarations
?DParser ´Â documentation string ¿¡ ¼±¾ðÇÔÀ¸·Î½á ³Ñ°ÜÁÙ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é
from dparser imoprt Parser
def d_somefunc(t) : '${declare longest_match}'
#...
(specifiers ¿Í declarations ¿¡ ´ëÇÑ ¼³¸íÀ» º¸°í ½ÍÀ¸¸é
?DParser ¸Þ´º¾óÀ» ºÁ¶ó)
¾×¼Ç¿¡¼ ´ÙÁß production
ÇϳªÀÇ documentation string ¿¡ ¿©·¯°³ÀÇ production À»(½ÉÁö¾î Àüü grammar±îÁö) ³ÖÀ» ¼ö ÀÖ´Ù. °¢°¢ÀÇ production ¿¡ ¼¼¹ÌÄÝ·ÐÀ» ºÙ¿©¶ó.
from dparser import Parser
def d_grammar(t):
'''sentence : noun verb;
noun : 'dog' | 'cat';
verb : 'run'
'''
print 'this function gets called for every reduction'
Parser().parse("dog run")