😎
PEGパーサーで、CIDR表記を解析する
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