63 个字母或者数字或者下划线。两个实体顺序写在一起,表示一种顺序关系, ALPHA *63(ALPHA/ DIGIT/ “_” ) 表示,以字母开始,后面最少 0 个,最多 63 个 字母或者数字或者下划线。
根据前面的内容可以很容易 地直接表达出用于解析这个语法规则的解析器来。如下:
class H248Parsec
{
public static Parser alpha() {
return new SAT(new IsAlpha(), new Item());
}
public static Parser digit() {
return new SAT(new IsDigit(), new Item());
}
public static Parser underline() {
return new SAT (new IsUnderline(), new Item());
}
public static Parser digit_or_alpha_or_underline() {
return new OR(alpha(), new OR(digit(), underline()));
}
public static Parser zero_or_many(int max, Parser parser) {
return new OR(new OneOrMany(max,parser), new Zero ());
}
public static Parser name() {
return new SEQ(alpha(),
zero_or_many(64,
digit_or_alpha_or_underline()));
}
}
利用Java实现组合式解析器(8)
时间:2011-09-09 ibm 孙鸣 邓辉
可以看出,我们的代码和协议中的语法描述基本上完全一样,我 们通过定义自己的面向解析的 DSL,把 Java 这种通用语言变成了用于 ABNF 语 法解析的专门语言,符合 Ward Cunningham 关于美的代码的定义。最后,我们 用该解析器来做一些关于 NAME 语法识别的实验,如下表所示:
输入字符串 |
成功标志 |
识别结果 |
剩余字符串 |
"" |
false |
"" |
"" |
"_U" |
false |
"" |
"" |
"2U" |
false |
"" |
"" |
"U" |
true |
"U" |
"" |
"U {" |
true |
"U" |
"{" |
"U2 {" |
True |
"U2" |
"{" |
"U_{" |
true |
"U_" |
"{" |
"U123_{" |
True |
"U123_" |
"{" |
"USER001" |
True |
"USER001" |
"" |
"USER001{" |
True |
"USER001" |
"{" |
"a0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789" |
True |
"a0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123" |
"456789" |
|