diff --git a/README.md b/README.md index 96cb75a..7b3b29a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ -# てきとーな ABNF ライブラリ +# SoftLibABNF Augumented BNF ライブラリ Twitter @okomeki ## 概要 -ABNFによるABNFのためのABNF +ABNFによるABNFのためのABNF parser または JavaCCのように ABNF compiler compiler と呼べばいいのかよくわからないもの + とりあえず作ってみたので公開する RFC 5234 ABNF、RFC 7405の拡張を実装したもの @@ -13,7 +14,7 @@ https://siisise.net/abnf.html せつめい ### 何ができるのか? ABNFのパース、一致判定 -rule単位でのパーサの埋め込み +rule単位での parser? builder? の埋め込み メールアドレスの判定がしたい URLの解析がしたい IPv6アドレスの(以下同文) @@ -25,8 +26,8 @@ rule単位でのパーサの埋め込み - 機能1 ABNF Parser - 機能2 ABNF 比較/一致判定とか - 機能3 実体参照、名前参照(循環参照)対応 -- 機能4 rule単位のパーサ埋め込み -- 例 JSON,JSON Pointerなどの実装 +- 機能4 rule単位の builder 埋め込み +- 例 JSON parser,JSON Pointerなどの実装 とりあえずサンプル net.siisise.abnf.parser5234.ABNF5234.java がABNF Parserの本体でありサンプルであるかもしれません。 @@ -42,7 +43,7 @@ RFC 5234 の 4.ABNFのABNFによる定義から static final ABNF rulelist = REG.rule( "rulelist = 1*( rule / (*c-wsp c-nl) )"); } -とりあえずこれでよいです。未定義のruleなども次の行に続けて定義していけば全体が完成します。 +とりあえずこれでよいです。未定義のruleやc-wspなども使えるので後の行に定義していけば全体が完成します。 static final ABNF rulelist = REG.rule( "rulelist", "1*( rule / (*c-wsp c-nl) )"); @@ -55,11 +56,11 @@ RFC 5234 の 4.ABNFのABNFによる定義から その他、ABNFとABNFRegをみれば何とかなるのかも。 -## 演算子 +## 演算子 Operators 3.演算子のものをJavaで書く手法です。不明であればABNFでも書けます。 -### 連接 Rule1 Rule2 #pl(複数) +### 連接 Concatenation: Rule1 Rule2 #pl(複数) foo = %x61 ; a bar = %x62 ; b @@ -70,28 +71,29 @@ RFC 5234 の 4.ABNFのABNFによる定義から ABNF mumble = REG.rule("mumble", foo.pl(bar, foo)); パース手法の違いで pl , plm , plu などがある。繰り返しを厳密に判定するなら plm や plu がいいのだが違いはまた別途。 +plu : unicode base -### 選択肢 Rule1 / Rule2 #or(複数) +### 選択肢 Alternatives: Rule1 / Rule2 #or(複数) - foo / bar - foo / bar / baz + ora = foo / bar + orb = foo / bar / baz - foo.or( bar ) - foo.or( bar. baz ) + ABNF ora = REG.rule("ora", foo.or( bar ) ); + ABNF orb = REG.rule("orb", foo.or( bar. baz ) ); -### 増分選択肢 Rule1 =/ Rule2 #or(複数) +### 増分選択肢 Incremental Alternatives: Rule1 =/ Rule2 #or(複数) ABNF oldrule = REG.rule( "oldrule", oldrule.or( additionalAlternatives ) ); // 特に定義なし REG.rule() または #name(String)を通さないと名前はつかない。 -### 範囲選択肢 %c##-## +### 範囲選択肢 Value Range Alternatives: %c##-## DIGIT = %x30-39 ABNF digit = REG.rule("digit", ABNF.range(0x30, 0x39)); -### 並びグループ +### 並びグループ Sequence Group: elem (foo / bar) blat elem foo / bar blat @@ -99,7 +101,7 @@ REG.rule() または #name(String)を通さないと名前はつかない。 elem.pl( foo.or( bar ), blat ) elem.pl(foo).or(bar.pl(blat)) -### 可変回数反復 *Rule +### 可変回数反復 Variable Repetition: *Rule *element @@ -108,13 +110,13 @@ REG.rule() または #name(String)を通さないと名前はつかない。 element.x() // a,bの省略 *element 値で省略する場合、a = 0, b = -1 と少々複雑 -### 特定回数反復 nRule +### 特定回数反復 Specific Repetition: nRule element element.x(n) -### 省略可能並び: [Rule] +### 省略可能並び Optional Sequence: [Rule] [foo bar] diff --git a/pom.xml b/pom.xml index 7c3d187..9a36de5 100644 --- a/pom.xml +++ b/pom.xml @@ -3,25 +3,87 @@ 4.0.0 net.siisise softlib-abnf - SoftLibABNF - 1.1.3-SNAPSHOT + 1.1.3 jar + SoftLibABNF + Java ABNF parser CC + https://github.com/okomeki/SoftLib + + + The Apache License, Version 2.0 + http://www.apache.org/license/LICENSE-2.0.txt + + + + + SATO Masatoshi + okome@siisise.net + Siisise Net + + + + scm:git:git://github.com/okomeki/SoftLibABNF.git + scm:git:ssh://github.com/okomeki/SoftLibABNF.git + https://github.com/okomeki/SoftLibABNF/tree/master + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + + attach-sources + package + + jar-no-fork + + + + org.apache.maven.plugins maven-compiler-plugin - 3.8.1 - - true - + 3.9.0 org.apache.maven.plugins maven-javadoc-plugin 3.3.1 + + + attach-javadocs + package + + jar + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 3.0.1 + + + sign-artifacts + verify + + sign + + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.8 + true - 1.9 + ossrh + https://s01.oss.sonatype.org/ + true @@ -30,7 +92,7 @@ net.siisise softlib - 1.1.3-SNAPSHOT + 1.1.4 jar @@ -53,6 +115,10 @@ + + ossrh + https://s01.oss.sonatype.org/content/repositories/snapshots + github GitHub okomeki Apache Maven SoftLib Packages diff --git a/src/main/java/net/siisise/abnf/ABNF.java b/src/main/java/net/siisise/abnf/ABNF.java index ef31545..60c756a 100644 --- a/src/main/java/net/siisise/abnf/ABNF.java +++ b/src/main/java/net/siisise/abnf/ABNF.java @@ -53,13 +53,18 @@ static ABNF list(String chlist) { /** * どれかの文字に一致するかな * - * @param binlist - * @return + * @param binlist バイト列的な文字列 + * @return どれかが含まれるABNF構文 */ static ABNF binlist(String binlist) { return new ABNFmap(binlist); } + /** + * + * @param ch 文字 + * @return 文字と一致するABNF + */ static ABNFbin bin(int ch) { return new ABNFbin(ch); } @@ -68,7 +73,7 @@ static ABNFbin bin(int ch) { * 文字列/文字との比較 * * @param str utf-8で一致文字列 - * @return + * @return 一致するABNF */ static ABNFbin bin(String str) { return new ABNFbin(str); @@ -111,8 +116,9 @@ static ABNFrange range(int min, int max) { * マイナス演算 * ABNFにはないので仮 * - * @param val - * @return + * @deprecated 未定 + * @param val 引かれるABNF + * @return 引き算できるABNF */ ABNF mn(ABNF val); @@ -130,7 +136,7 @@ static ABNFrange range(int min, int max) { * * @param min 指定しない場合は 0 * @param max 指定しない場合は -1 - * @return + * @return 繰り返しのABNF */ ABNF x(int min, int max); @@ -145,7 +151,7 @@ static ABNFrange range(int min, int max) { * 1回以上ループ * 1*XXX * - * @return + * @return 1回以上繰り返しのABNF */ ABNF ix(); @@ -177,7 +183,7 @@ static ABNFrange range(int min, int max) { * 複製可能な構造を推奨(ループがあると複製は難しい) * * @param reg 複製もと - * @return + * @return ABNFの複製 */ ABNF copy(ABNFReg reg); } diff --git a/src/main/java/net/siisise/abnf/ABNFbin.java b/src/main/java/net/siisise/abnf/ABNFbin.java index 281215f..41c3a3c 100644 --- a/src/main/java/net/siisise/abnf/ABNFbin.java +++ b/src/main/java/net/siisise/abnf/ABNFbin.java @@ -52,7 +52,7 @@ public ABNFbin copy(ABNFReg reg) { * * @deprecated ABNFmap に移行かな * @param val 文字の一括登録 - * @return + * @return 1文字単位で比較するorっぽいABNF */ public static ABNF list(String val) { FrontPacket src = pac(val); diff --git a/src/main/java/net/siisise/abnf/AbstractABNF.java b/src/main/java/net/siisise/abnf/AbstractABNF.java index 50cce6b..361a623 100644 --- a/src/main/java/net/siisise/abnf/AbstractABNF.java +++ b/src/main/java/net/siisise/abnf/AbstractABNF.java @@ -13,9 +13,10 @@ public ABNF name(String name) { } /** + * Concatenation の単純版 * *(a / b ) a の様なものが解析できないが速そう - * @param val - * @return + * @param val plus する ABNF列 + * @return 簡易に比較するABNF */ @Override public ABNF pl(ABNF... val) { @@ -29,9 +30,10 @@ public ABNF pl(ABNF... val) { } /** + * やや厳密に対応する足し算版 * *( a / b ) a にも対応 - * @param val - * @return + * @param val plus する ABNF列 + * @return 厳密に比較できるABNF */ @Override public ABNF plm(ABNF... val) { @@ -46,8 +48,8 @@ public ABNF plm(ABNF... val) { /** * Unicode単位で比較する若干速いのかもしれない版 plm - * @param val - * @return + * @param val plus する ABNF列 + * @return unicodeで比較されるABNF処理 */ @Override public ABNF plu(ABNF... val) { @@ -73,10 +75,10 @@ public ABNF or(ABNF... val) { } /** - * - * @param - * @param ret - * @param sub + * 結果2を1に混ぜる + * @param 戻り型 + * @param ret 結果1 + * @param sub 結果2 */ static void mix(C ret, C sub) { ret.ret.write(sub.ret.toByteArray()); diff --git a/src/main/java/net/siisise/abnf/FindABNF.java b/src/main/java/net/siisise/abnf/FindABNF.java index f9d04ed..c718b4c 100644 --- a/src/main/java/net/siisise/abnf/FindABNF.java +++ b/src/main/java/net/siisise/abnf/FindABNF.java @@ -31,11 +31,11 @@ public C find(FrontPacket pac, BNFParser... parsers) { /** * 詰め方の工夫をするターン * - * @param - * @param pac - * @param ns - * @param parsers - * @return + * @param 戻り型 + * @param pac 入りデータ + * @param ns name space + * @param parsers サブ要素のパーサー + * @return パース結果 */ @Override public C find(FrontPacket pac, N ns, BNFParser... parsers) { diff --git a/src/main/java/net/siisise/abnf/IsABNF.java b/src/main/java/net/siisise/abnf/IsABNF.java index f6919e2..78ea6a8 100644 --- a/src/main/java/net/siisise/abnf/IsABNF.java +++ b/src/main/java/net/siisise/abnf/IsABNF.java @@ -17,11 +17,11 @@ public Packet is(FrontPacket pac, N ns) { /** * sub要素のない場合の軽い対応 - * @param - * @param pac - * @param ns - * @param parsers - * @return + * @param パラメータっぽい型 + * @param pac 解析データ + * @param ns name space + * @param parsers サブ要素のparser + * @return 処理結果 */ @Override public C find(FrontPacket pac, N ns, BNFParser... parsers) { diff --git a/src/main/java/net/siisise/abnf/parser/ABNFSelect.java b/src/main/java/net/siisise/abnf/parser/ABNFSelect.java index a7681a8..b2f087a 100644 --- a/src/main/java/net/siisise/abnf/parser/ABNFSelect.java +++ b/src/main/java/net/siisise/abnf/parser/ABNFSelect.java @@ -17,9 +17,10 @@ protected ABNFSelect(ABNF rule, ABNFReg base, String... casenames) { } /** - * - * @param pac - * @return + * select っぽいことをする + * casenames 内に該当するものがあればそれを返す なければ otherに振る + * @param pac 解析済みデータ列 + * @return 処理結果 */ @Override protected T build(ABNF.C pac) { diff --git a/src/main/java/net/siisise/abnf/parser5234/Repetition.java b/src/main/java/net/siisise/abnf/parser5234/Repetition.java index 4aed01c..d99b1fb 100644 --- a/src/main/java/net/siisise/abnf/parser5234/Repetition.java +++ b/src/main/java/net/siisise/abnf/parser5234/Repetition.java @@ -4,7 +4,6 @@ import net.siisise.abnf.ABNF; import net.siisise.abnf.ABNFReg; import net.siisise.abnf.parser.ABNFBuildParser; -import net.siisise.io.FrontPacket; /** * リピートはorに展開せよ? diff --git a/src/main/java/net/siisise/bnf/AbstractBNF.java b/src/main/java/net/siisise/bnf/AbstractBNF.java index 7ac9be9..ae50725 100644 --- a/src/main/java/net/siisise/bnf/AbstractBNF.java +++ b/src/main/java/net/siisise/bnf/AbstractBNF.java @@ -83,10 +83,10 @@ public static String str(FrontPacket pac) { } /** - * 文字列に起こす。 データは元に戻す。 + * 文字列に起こす。 データは元に戻すので減らない。 * - * @param pac - * @return + * @param pac 元パケット + * @return 文字に変えたもの */ public static String strd(FrontPacket pac) { byte[] data = pac.toByteArray(); @@ -98,10 +98,12 @@ public static String strd(FrontPacket pac) { /** * 名前が該当すればそれ以下を削除して詰め直す * - * @param - * @param cret + * @param 戻りの型 + * @param name space の型 + * @param cret 戻り + * @param ns name space * @param parser 一致するものだけ必要 - * @return + * @return 戻りからさらにparserを通したものを追加したもの */ protected C subBuild(C cret, N ns, BNFParser parser) { if (parser != null) { diff --git a/src/main/java/net/siisise/bnf/BNF.java b/src/main/java/net/siisise/bnf/BNF.java index e5fc94b..7e61aaa 100644 --- a/src/main/java/net/siisise/bnf/BNF.java +++ b/src/main/java/net/siisise/bnf/BNF.java @@ -30,7 +30,7 @@ public interface BNF { * 先頭一致でパースする。 * findとどちらかの実装が必要、片方は省略可能 * @param user name space type - * @param pac + * @param pac 比較バイナリ列 * @param ns user name space * @return 一致した範囲 */ @@ -41,7 +41,7 @@ public interface BNF { * 先頭一致でパースする。 * * @param user name space type - * @param val + * @param val 比較文字列 * @param ns user name space * @return 一致ありなし */ diff --git a/src/main/java/net/siisise/ebnf/xml/XML.java b/src/main/java/net/siisise/ebnf/xml/XML.java index 14ef1b6..75b8cc2 100644 --- a/src/main/java/net/siisise/ebnf/xml/XML.java +++ b/src/main/java/net/siisise/ebnf/xml/XML.java @@ -7,8 +7,7 @@ * IETF BCP 47 * IANA-LANGCODES * - * @see net.siisise.abnf.rfc.Lang5646 BCP 47 - * @author okome + * net.siisise.abnf.rfc.Lang5646 BCP 47 */ public class XML { static final XMLEBNFReg REG = new XMLEBNFReg();