« 今日の日記 | Main | 今日の日記 »

2008.02.08

[minipy] 演算子のオーバーロードを使ってみた

befor

# 特定のトークンを見つけるパーサ
eoi = parser.end_of_input()
nl = parser.lookfor('TOK_NEWLINE')
lk_print = parser.lookfor('TOK_KW_PRINT')
int = parser.lookfor('TOK_LITERAL_INT')
plus = parser.lookfor('TOK_PLUS')
minus = parser.lookfor('TOK_MINUS')

#a_expr ::= integer ( ( "+" | "-" ) integer)*
p_or_n = parser.alt('p_or_n', [plus, minus])
p_or_n_int = parser.cat('p_or_n_int', [p_or_n, int])
p_or_n_int_star = parser.star('p_or_n_int_star', p_or_n_int)
a_expr = parser.cat('a_expr', [int, p_or_n_int_star])

#expression ::= a_expr
expression = parser.cat('expression', [a_expr,])

#print_stmt ::= "print" expression_list_with_comma
print_stmt = parser.cat('print_stmt', [lk_print, expression])

#statement ::= print_stmt NEWLINE
statement = parser.cat('statement', [print_stmt, nl])

#file_input ::= (NEWLINE | statement)* EOF
nl_or_st = parser.alt('nl_or_st', [nl, statement])
nl_or_st_star = parser.star('nl_or_st_star', nl_or_st)
entire_input = parser.cat('file_input',[nl_or_st_star, eoi])

after

# 特定のトークンを見つけるパーサ
eoi = parser.end_of_input()
nl = parser.lookfor('TOK_NEWLINE')
lk_print = parser.lookfor('TOK_KW_PRINT')
int = parser.lookfor('TOK_LITERAL_INT')
plus = parser.lookfor('TOK_PLUS')
minus = parser.lookfor('TOK_MINUS')

#a_expr ::= integer ( ( "+" | "-" ) integer)*
a_expr = int + star((plus | minus) + int)

#expression ::= a_expr
expression = a_expr + None

#print_stmt ::= "print" expression_list_with_comma
print_stmt = lk_print + expression

#statement ::= print_stmt NEWLINE
statement = print_stmt + nl

#file_input ::= (NEWLINE | statement)* EOF
entire_input = star(nl | statement) + eoi

ちゃんと動いた!。
これなら文法を手入力しても良いかなってレベルになった。

文法の名前は自動でつけるようにして、各パーサの基底クラスに下の行加えただけ。動作確認入れても30分。LLって凄いよ。ほんと。
def __add__(self, other):
 if other == None:
  return cat([self,])
 else:
  return cat([self, other])

def __or__(self, other):
 return alt([self, other])

Higher-order-PerlとPython万歳!

|

« 今日の日記 | Main | 今日の日記 »

Comments

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/18154/40049162

Listed below are links to weblogs that reference [minipy] 演算子のオーバーロードを使ってみた:

« 今日の日記 | Main | 今日の日記 »