開発環境
- OS X El Capitan - Apple (OS)
- Emacs(Text Editor)
- Python 3.5 (プログラミング言語)
アンダースタンディング コンピュテーション (Tom Stuart (著)、 笹田 耕一(著)、笹井 崇司 (翻訳)、オライリージャパン)の第1部(プログラムと機械)、3章(最も単純なコンピュータ)、3.3(正規表現)、3.3.1(構文)を Python (本書ではRuby) で取り組んでみる。
3.3.1(構文)
コード(Emacs)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Pattern:
def __init__(self, precedence):
self.precedence = precedence
def bracket(self, outer_precedence):
if self.precedence < outer_precedence:
return '({0})'.format(self)
return str(self)
def __repr__(self):
return '/{0}/'.format(self)
class Empty(Pattern):
def __init__(self):
Pattern.__init__(self, 3)
def __str__(self):
return ''
class Literal(Pattern):
def __init__(self, character):
Pattern.__init__(self, 3)
self.character = character
def __str__(self):
return self.character
class Concatenate(Pattern):
def __init__(self, first, second):
Pattern.__init__(self, 1)
self.first = first
self.second = second
def __str__(self):
return ''.join(map(lambda pattern: pattern.bracket(pattern.precedence),
(self.first, self.second)))
class Choose(Pattern):
def __init__(self, first, second):
Pattern.__init__(self, 0)
self.first = first
self.second = second
def __str__(self):
return '|'.join(map(lambda pattern: pattern.bracket(pattern.precedence),
(self.first, self.second)))
class Repeat(Pattern):
def __init__(self, pattern):
Pattern.__init__(self, 2)
self.pattern = pattern
def __str__(self):
return self.pattern.bracket(pattern.precedence) + '*'
if __name__ == '__main__':
pattern = Repeat(Choose(Concatenate(Literal('a'),
Literal('b')),
Literal('a')))
print(pattern)
print(repr(pattern))
入出力結果(Terminal, IPython)
$ ./sample3_1.py (ab|a)* /(ab|a)*/ $
0 コメント:
コメントを投稿