Changeset 24513

Show
Ignore:
Timestamp:
11/20/08 23:45:10 (7 weeks ago)
Author:
hiratara
Message:

左結合になるようにルールを修正
lexerとparserのインタフェースは変えないようにしてみた
OOPなインタフェースがあんまりだったから整理
左結合になるように修正

Location:
lang/python/dfareg/branches/codezine200809/dfareg
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lang/python/dfareg/branches/codezine200809/dfareg/nfabuilder.py

    r21916 r24513  
    7171        return frag 
    7272 
     73    def __str__(self): 
     74        return "(%s|%s)" % (self.operand1, self.operand2) 
     75 
    7376 
    7477class Concat(object): 
     
    8992 
    9093        return frag 
     94    def __str__(self): 
     95        return "(%s%s)" % (self.operand1, self.operand2) 
     96 
    9197 
    9298class Star(object): 
     
    109115        return frag 
    110116 
     117    def __str__(self): 
     118        return "%s*" % self.operand 
     119 
    111120class Character(object): 
    112121    def __init__(self, char): 
     
    123132 
    124133        return frag 
     134    def __str__(self): 
     135        return self.char 
  • lang/python/dfareg/branches/codezine200809/dfareg/parser.py

    r23630 r24513  
    1313    ---------------------------------------- 
    1414    expression -> subexpr 
    15     subexpr    -> seq '|' subexpr | seq 
     15    subexpr    -> subexpr '|' seq | seq 
     16    ( 
     17        subexpr    -> seq _subexpr 
     18        _subexpr   -> '|' seq _subexpr | ε 
     19    ) 
    1620    seq        -> subseq | ε 
    17     subseq     -> star subseq | star 
     21    subseq     -> subseq star | star 
     22    ( 
     23        subseq     -> star _subseq 
     24        _subseq    -> star _subseq | ε 
     25    ) 
    1826    star       -> factor '*' | factor 
    1927    factor     -> '(' subexpr ')' | CHARACTER 
     
    4654 
    4755    def subexpr(self): 
    48         # subexpr    -> seq '|' subexpr | seq 
     56        # subexpr -> seq _subexpr 
    4957        node = self.seq() 
    50         if self.look.kind == Token.OPE_UNION: 
    51             self.match(Token.OPE_UNION) 
    52             node2 = self.subexpr() 
    53             node = Union(node, node2) 
     58        while True: 
     59            if self.look.kind == Token.OPE_UNION: 
     60                # _subexpr -> '|' seq _subexpr | ε 
     61                self.match(Token.OPE_UNION) 
     62                node2 = self.seq() 
     63                node = Union(node, node2) 
     64            else: 
     65                # _subexpr -> ε 
     66                break 
    5467        return node 
    5568 
     
    6477 
    6578    def subseq(self): 
    66         node1 = self.star() 
    67         if self.look.kind == Token.LPAREN \ 
    68            or self.look.kind == Token.CHARACTER: 
    69             # subseq -> star subseq 
    70             node2 = self.subseq() 
    71             node  = Concat(node1, node2) 
    72             return node 
    73         else: 
    74             # subseq -> star 
    75             return node1 
     79        # subseq -> star _subseq 
     80        node = self.star() 
     81        while True: 
     82            if self.look.kind == Token.LPAREN \ 
     83               or self.look.kind == Token.CHARACTER: 
     84                # _subseq -> star _subseq 
     85                node2 = self.star() 
     86                node  = Concat(node, node2) 
     87                continue 
     88            else: 
     89                # _subseq -> ε 
     90                break 
     91        return node 
    7692 
    7793    def star(self):