2015年12月2日水曜日

開発環境

  • 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 コメント:

コメントを投稿