def parse_from
      s0 = @current_pos
      s1 = match_str("打")
      if s1 != :failed
        @reported_pos = s0
        s1 = nil
      end
      s0 = s1
      if s0 == :failed
        s0 = @current_pos
        if match_str("(") != :failed
          s2 = match_regexp(/^[1-9]/)
          if s2 != :failed
            s3 = match_regexp(/^[1-9]/)
            if s3 != :failed
              if match_str(")") != :failed
                @reported_pos = s0
                s0 = { "x" => s2.to_i, "y" => s3.to_i }
              else
                @current_pos = s0
                s0 = :failed
              end
            else
              @current_pos = s0
              s0 = :failed
            end
          else
            @current_pos = s0
            s0 = :failed
          end
        else
          @current_pos = s0
          s0 = :failed
        end
      end
      s0
    end
def parse_from
      s0 = @current_pos
      s1 = match_str("打")
      if s1 != :failed
        @reported_pos = s0
        s1 = nil
      end
      s0 = s1
      if s0 == :failed
        s0 = @current_pos
        if match_str("(") != :failed
          s2 = match_regexp(/^[1-9]/)
          if s2 != :failed
            s3 = match_regexp(/^[1-9]/)
            if s3 != :failed
              if match_str(")") != :failed
                @reported_pos = s0
                s0 = { "x" => s2.to_i, "y" => s3.to_i }
              else
                @current_pos = s0
                s0 = :failed
              end
            else
              @current_pos = s0
              s0 = :failed
            end
          else
            @current_pos = s0
            s0 = :failed
          end
        else
          @current_pos = s0
          s0 = :failed
        end
      end
      s0
    end
from : "打" | "(" [1-9] [1-9] ")"