😎

PEGパーサーで、CIDR表記を解析する

2023/05/05に公開

PEGパーサーで、CIDR表記を解析しました。数字の範囲などは、ざっくりです。。。

書いてみた

# frozen_string_literal: true

require 'rspec'
require 'parslet'

# CIDR表記
class CIDRNotationParser < Parslet::Parser
  root :cidr_notation

  rule(:cidr_notation) do
    octet >> dot >> octet >> dot >> octet >> dot >> octet >> slash >> cidr
  end

  rule(:octet) { digit.repeat(1, 3) }
  rule(:cidr) { digit.repeat(1, 2) }

  rule(:dot) { str('.') }
  rule(:slash) { str('/') }
  rule(:digit) { match('[0-9]') }
end

RSpec.describe CIDRNotationParser do
  describe '#parser' do
    subject { described_class.new.parse(raw_string) }

    context '198.51.100.0/24を解析する場合' do
      let(:raw_string) { '198.51.100.0/24' }

      it { is_expected.to eq '198.51.100.0/24' }
    end

    context '255.255.255.224/27を解析する場合' do
      let(:raw_string) { '255.255.255.224/27' }

      it { is_expected.to eq '255.255.255.224/27' }
    end

    context '10.1.2.132/26を解析する場合' do
      let(:raw_string) { '10.1.2.132/26' }

      it { is_expected.to eq '10.1.2.132/26' }
    end

    context '10.1.2.144/28を解析する場合' do
      let(:raw_string) { '10.1.2.144/28' }

      it { is_expected.to eq '10.1.2.144/28' }
    end

    context '10.1.160.0/20を解析する場合' do
      let(:raw_string) { '10.1.160.0/20' }

      it { is_expected.to eq '10.1.160.0/20' }
    end
  end
end

Discussion