diff --git a/Cargo.lock b/Cargo.lock index 0de50b1..56404c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,625 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", -] - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "bitflags", - "textwrap", - "unicode-width", -] - -[[package]] -name = "criterion" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" -dependencies = [ - "atty", - "cast", - "clap", - "criterion-plot", - "csv", - "itertools", - "lazy_static", - "num-traits", - "oorandom", - "plotters", - "rayon", - "regex 1.11.1", - "serde", - "serde_cbor", - "serde_derive", - "serde_json", - "tinytemplate", - "walkdir", -] - -[[package]] -name = "criterion-plot" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" -dependencies = [ - "cast", - "itertools", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "csv" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" -dependencies = [ - "memchr", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "half" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.169" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" - -[[package]] -name = "log" -version = "0.4.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" - -[[package]] -name = "oorandom" -version = "11.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" - -[[package]] -name = "plotters" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" -dependencies = [ - "num-traits", - "plotters-backend", - "plotters-svg", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "plotters-backend" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" - -[[package]] -name = "plotters-svg" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" -dependencies = [ - "plotters-backend", -] - -[[package]] -name = "proc-macro2" -version = "1.0.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - [[package]] name = "regex" version = "0.1.0" -dependencies = [ - "criterion", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "rustversion" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" - -[[package]] -name = "ryu" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "serde" -version = "1.0.217" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_cbor" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" -dependencies = [ - "half", - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.217" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.138" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "syn" -version = "2.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "tinytemplate" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "unicode-ident" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" - -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/Cargo.toml b/Cargo.toml index 0e7abd3..a398be0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,10 +4,3 @@ version = "0.1.0" edition = "2021" [dependencies] - -[dev-dependencies] -criterion = "0.3.5" - -[[bench]] -name = "benchmark" -harness = false \ No newline at end of file diff --git a/benches/benchmark.rs b/benches/benchmark.rs deleted file mode 100644 index d8fff2e..0000000 --- a/benches/benchmark.rs +++ /dev/null @@ -1,85 +0,0 @@ -//! # パフォーマンス計測 -//! -//! ## 計測方法 -//! a?^n a^nという正規表現を、a^nという文字列にマッチさせる。 -//! ただし、a?^nとa^nは、a?とaのn回の繰り返し。 -//! 計測は幅優先と深さ優先で行う。 -//! -//! ## n = 3の場合の例 -//! -//! - 正規表現: a?a?a?aaa -//! - str: aaa -//! -//! ## 実行方法 -//! -//! cargo-criterionをインストール後、cargo criterionと実行。 -//! -//! ```text -//! $ cargo install cargo-criterion -//! $ cargo criterion -//! ``` -//! -//! 実行後は、target/criterion/reports/index.htmlというファイルが生成されるため、 -//! それをWebブラウザで閲覧する。 -use criterion::{criterion_group, criterion_main, Criterion}; -use regex::do_matching; -use std::time::Duration; - -/// (計測のid、a?^n a^nという正規表現、文字列)というタプル -const INPUTS: &[(&str, &str, &str)] = &[ - ("n = 2", "a?a?aa", "aa"), - ("n = 4", "a?a?a?a?aaaa", "aaaa"), - ("n = 6", "a?a?a?a?a?a?aaaaaa", "aaaaaa"), - ("n = 8", "a?a?a?a?a?a?a?a?aaaaaaaa", "aaaaaaaa"), - ("n = 10", "a?a?a?a?a?a?a?a?a?a?aaaaaaaaaa", "aaaaaaaaaa"), - ( - "n = 12", - "a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaa", - "aaaaaaaaaaaa", - ), - ( - "n = 14", - "a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaa", - "aaaaaaaaaaaaaa", - ), - ( - "n = 16", - "a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaa", - "aaaaaaaaaaaaaaaa", - ), - ( - "n = 18", - "a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaa", - "aaaaaaaaaaaaaaaaaa", - ), - ( - "n = 20", - "a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaaaa", - "aaaaaaaaaaaaaaaaaaaa", - ), -]; - -fn depth_first(c: &mut Criterion) { - let mut g = c.benchmark_group("Depth First"); - g.measurement_time(Duration::from_secs(12)); - - for i in INPUTS { - g.bench_with_input(i.0, &(i.1, i.2), |b, args| { - b.iter(|| do_matching(args.0, args.1, true)) - }); - } -} - -fn width_first(c: &mut Criterion) { - let mut g = c.benchmark_group("Width First"); - g.measurement_time(Duration::from_secs(12)); - - for i in INPUTS { - g.bench_with_input(i.0, &(i.1, i.2), |b, args| { - b.iter(|| do_matching(args.0, args.1, false)) - }); - } -} - -criterion_group!(benches, width_first, depth_first); -criterion_main!(benches); diff --git a/src/engine.rs b/src/engine.rs index 54d3822..6cd06f3 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -1,12 +1,10 @@ //! 正規表現エンジン + +use std::fmt::{self, Display}; mod codegen; mod evaluator; mod parser; -use crate::helper::DynError; -use std::fmt::{self, Display}; - -/// 命令列 #[derive(Debug)] pub enum Instruction { Char(char), @@ -25,58 +23,3 @@ impl Display for Instruction { } } } - -/// 正規表現をパースしてコード生成し、 -/// ASTと命令列を標準出力に表示。 -/// -/// # 利用例 -/// -/// ``` -/// use regex; -/// regex::print("abc|(de|cd)+"); -/// ``` -/// -/// # 返り値 -/// -/// 入力された正規表現にエラーがあったり、内部的な実装エラーがある場合はErrを返す。 -pub fn print(expr: &str) -> Result<(), DynError> { - println!("expr: {expr}"); - let ast = parser::parse(expr)?; - println!("AST: {:?}", ast); - - println!(); - println!("code:"); - let code = codegen::get_code(&ast)?; - for (n, c) in code.iter().enumerate() { - println!("{:>04}: {c}", n); - } - - Ok(()) -} - -/// 正規表現と文字列をマッチング。 -/// -/// # 利用例 -/// -/// ``` -/// use regex; -/// regex::do_matching("abc|(de|cd)+", "decddede", true); -/// ``` -/// -/// # 引数 -/// -/// exprに正規表現、lineにマッチ対象とする文字列を与える。 -/// is_depthがtrueの場合は深さ優先探索を、falseの場合は幅優先探索を利用。 -/// -/// # 返り値 -/// -/// エラーなく実行でき、かつマッチングに**成功**した場合はOk(true)を返し、 -/// エラーなく実行でき、かつマッチングに**失敗**した場合はOk(false)を返す。 -/// -/// 入力された正規表現にエラーがあったり、内部的な実装エラーがある場合はErrを返す。 -pub fn do_matching(expr: &str, line: &str, is_depth: bool) -> Result<bool, DynError> { - let ast = parser::parse(expr)?; - let code = codegen::get_code(&ast)?; - let line = line.chars().collect::<Vec<char>>(); - Ok(evaluator::eval(&code, &line, is_depth)?) -} diff --git a/src/lib.rs b/src/lib.rs index b39f73c..47da32c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,4 +12,4 @@ mod engine; mod helper; -pub use engine::{do_matching, print}; +// pub use engine::{do_matching, print}; diff --git a/src/main.rs b/src/main.rs index 4fe2503..e7a11a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,102 +1,3 @@ -mod engine; -mod helper; - -use helper::DynError; -use std::{ - env, - fs::File, - io::{BufRead, BufReader}, -}; - -fn main() -> Result<(), DynError> { - let args: Vec<String> = env::args().collect(); - if args.len() <= 2 { - eprintln!("usage: {} regex file", args[0]); - return Err("invalid arguments".into()); - } else { - match_file(&args[1], &args[2])?; - } - - Ok(()) -} - -/// ファイルをオープンし、行ごとにマッチングを行う。 -/// -/// マッチングはそれぞれの行頭から1文字ずつずらして行い、 -/// いずれかにマッチした場合に、その行がマッチしたものとみなす。 -/// -/// たとえば、abcdという文字列があった場合、以下の順にマッチが行われ、 -/// このいずれかにマッチした場合、与えられた正規表現にマッチする行と判定する。 -/// -/// - abcd -/// - bcd -/// - cd -/// - d -fn match_file(expr: &str, file: &str) -> Result<(), DynError> { - let f = File::open(file)?; - let reader = BufReader::new(f); - - engine::print(expr)?; - println!(); - - for line in reader.lines() { - let line = line?; - for (i, _) in line.char_indices() { - if engine::do_matching(expr, &line[i..], true)? { - println!("{line}"); - break; - } - } - } - - Ok(()) -} - -// 単体テスト。プライベート関数もテスト可能 -#[cfg(test)] -mod tests { - use crate::{ - engine::do_matching, - helper::{safe_add, SafeAdd}, - }; - - #[test] - fn test_safe_add() { - let n: usize = 10; - assert_eq!(Some(30), n.safe_add(&20)); - - let n: usize = !0; // 2^64 - 1 (64 bits CPU) - assert_eq!(None, n.safe_add(&1)); - - let mut n: usize = 10; - assert!(safe_add(&mut n, &20, || ()).is_ok()); - - let mut n: usize = !0; - assert!(safe_add(&mut n, &1, || ()).is_err()); - } - - #[test] - fn test_matching() { - // パースエラー - assert!(do_matching("+b", "bbb", true).is_err()); - assert!(do_matching("*b", "bbb", true).is_err()); - assert!(do_matching("|b", "bbb", true).is_err()); - assert!(do_matching("?b", "bbb", true).is_err()); - - // パース成功、マッチ成功 - assert!(do_matching("abc|def", "def", true).unwrap()); - assert!(do_matching("(abc)*", "abcabc", true).unwrap()); - assert!(do_matching("(ab|cd)+", "abcdcd", true).unwrap()); - assert!(do_matching("abc?", "ab", true).unwrap()); - assert!(do_matching("((((a*)*)*)*)", "aaaaaaaaa", true).unwrap()); - assert!(do_matching("(a*)*b", "aaaaaaaaab", true).unwrap()); - assert!(do_matching("(a*)*b", "b", true).unwrap()); - assert!(do_matching("a**b", "aaaaaaaaab", true).unwrap()); - assert!(do_matching("a**b", "b", true).unwrap()); - - // パース成功、マッチ失敗 - assert!(!do_matching("abc|def", "efa", true).unwrap()); - assert!(!do_matching("(ab|cd)+", "", true).unwrap()); - assert!(!do_matching("abc?", "acb", true).unwrap()); - } +fn main() { + println!("Hello, world!"); }