博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Predictive Parsing的ABNF语法分析器(六)——AbnfParser文法解析器之多个符号连接的情形(如rule和CRLF)...
阅读量:5840 次
发布时间:2019-06-18

本文共 5387 字,大约阅读时间需要 17 分钟。

基于预测的文法分析器,一个明显的特点就是将非终结符定义为解析函数(方法),当非终结符号可以派生为其他非终结符号时,在解析函数中递归调用即可。这种方法的一个缺点,是难以处理需要回溯的情形,后面我们再详细分析。上次我们研究了诸如CR、LF、HTAB等单个字符的解析,这一篇来看看稍微复杂一点的多个符号连接的情形,包括CRLF和RULE两个符号。

/*    This file is one of the component a Context-free Grammar Parser Generator,    which accept a piece of text as the input, and generates a parser    for the inputted context-free grammar.    Copyright (C) 2013, Junbiao Pan (Email: panjunbiao@gmail.com)    This program is free software: you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation, either version 3 of the License, or    any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program.  If not, see 
. */// CRLF = CR LF protected String CRLF() throws IOException, MatchException { // 回车和换行符号,直接调用相应的CR、LF方法来进行解析就OK。 return CR() + LF(); } // CRLF = CR LF @Test// 测试CRLF方法的单元测试方法 public void testCRLF() throws Exception {// 创建一个测试器,在测试器的test方法中调用被测方法CRLF() Tester
tester = new Tester
() { @Override public String test(AbnfParser parser) throws MatchException, IOException { return parser.CRLF(); } };// 对于字符串0x0D + 0x0A,断言解析成功 Assert.assertEquals(String.valueOf((char)0x0D) + String.valueOf((char)0x0A), AbnfParserFactory.newInstance(new char[] {0x0D, 0x0A}).CRLF());// 对于字符串0x0D + 0x0A + 0x0C,断言解析成功,但最后面的0x0C不应该被解析。 Assert.assertEquals(String.valueOf((char)0x0D) + String.valueOf((char)0x0A), AbnfParserFactory.newInstance(new char[] {0x0D, 0x0A, 0x0C}).CRLF());// 对于字符串0x0D + 0x0A + 0x0D,断言解析成功,但最后面的0x0D不应该被解析。 Assert.assertEquals(String.valueOf((char)0x0D) + String.valueOf((char)0x0A), AbnfParserFactory.newInstance(new char[] {0x0D, 0x0A, 0x0D}).CRLF());// 对于字符串0x0D + 0x0A + 0x0A,断言解析成功,但最后面的0x0A不应该被解析。 Assert.assertEquals(String.valueOf((char)0x0D) + String.valueOf((char)0x0A), AbnfParserFactory.newInstance(new char[] {0x0D, 0x0A, 0x0A}).CRLF());// 对于空字符串0x0D + 0x0A + 0x0C,断言解析异常 Assertion.assertMatchException("", tester, 1, 1);// 对于字符串0x0D,断言解析异常 Assertion.assertMatchException("" + (char)0x0D, tester, 1, 1);// 对于字符串0x0A,断言解析异常 Assertion.assertMatchException("" + (char)0x0A, tester, 1, 1); }// rule = rulename defined-as elements c-nl// 解析rule的方法 protected Rule rule() throws IOException, MatchException {// rule的第一个元素是rulename,首先调用rulename()方法,并记录解析到的规则名 RuleName rulename = rulename();// rulename后面紧接着defined-as元素,调用相应的方法 String definedAs = defined_as();// defined-as后面接着elements元素,调用elements() Elements elements = elements();// elements后面接着c-nl元素,调用之。 c_nl();// 返回解析到的规则 return new Rule(rulename, definedAs, elements); } // rule = rulename defined-as elements c-nl @Test public void testRule() throws Exception {// 创建测试器 Tester
tester = new Tester
() { @Override public Rule test(AbnfParser parser) throws MatchException, IOException { return parser.rule(); } }; String input; Elements elements; elements = AbnfParserFactory.newInstance("b").elements();// a=b是一条符合文法的规则 Assertion.assertMatch("a=b" + (char)0x0D + (char)0x0A, tester, new Rule(new RuleName("a"), "=", elements), 1, 2);// a=/b是一条符合文法的规则 Assertion.assertMatch("a=/b" + (char)0x0D + (char)0x0A, tester, new Rule(new RuleName("a"), "=/", elements), 1, 2); elements = AbnfParserFactory.newInstance("b/c").elements(); Assertion.assertMatch("a=b/c" + (char)0x0D + (char)0x0A, tester, new Rule(new RuleName("a"), "=", elements), 1, 2); Assertion.assertMatch("a=/b/c" + (char)0x0D + (char)0x0A, tester, new Rule(new RuleName("a"), "=/", elements), 1, 2); elements = AbnfParserFactory.newInstance("b c d").elements();// a=b c d是一条符合文法的规则 Assertion.assertMatch("a=b c d" + (char)0x0D + (char)0x0A, tester, new Rule(new RuleName("a"), "=", elements), 1, 2);// a=/b c d是一条符合文法的规则 Assertion.assertMatch("a=/b c d" + (char)0x0D + (char)0x0A, tester, new Rule(new RuleName("a"), "=/", elements), 1, 2); elements = AbnfParserFactory.newInstance("[b]").elements();// a=[b]是一条符合文法的规则 Assertion.assertMatch("a=[b]" + (char)0x0D + (char)0x0A, tester, new Rule(new RuleName("a"), "=", elements), 1, 2);// a=/[b]是一条符合文法的规则 Assertion.assertMatch("a=/[b]" + (char)0x0D + (char)0x0A, tester, new Rule(new RuleName("a"), "=/", elements), 1, 2); elements = AbnfParserFactory.newInstance("*b").elements();// a=*b是一条符合文法的规则 Assertion.assertMatch("a=*b" + (char)0x0D + (char)0x0A, tester, new Rule(new RuleName("a"), "=", elements), 1, 2);// a=/*b是一条符合文法的规则 Assertion.assertMatch("a=/*b" + (char)0x0D + (char)0x0A, tester, new Rule(new RuleName("a"), "=/", elements), 1, 2); }

下一篇我们将分析更复杂的文法。

转载地址:http://stvcx.baihongyu.com/

你可能感兴趣的文章
Qt设置背景图片
查看>>
【阿里云文档】常用文档整理
查看>>
java中的Volatile关键字
查看>>
前端自定义图标
查看>>
实验二
查看>>
独立开发一个云(PaaS)的核心要素, Go, Go, Go!!!
查看>>
网站文章如何能自动判定是抄袭?一种算法和实践架构剖析
查看>>
【OpenCV学习】滚动条
查看>>
ofo用科技引领行业进入4.0时代 用户粘性连续8个月远甩摩拜
查看>>
兰州青年志愿者“中西合璧”玩快闪 温暖旅客回家路
查看>>
计划10年建10万廉价屋 新西兰政府:比想象中难
查看>>
甘肃发首版《3D打印职业教育教材》:校企合作育专才
查看>>
为找好心人抚养孩子 浙江一离婚父亲将幼童丢弃公园
查看>>
晚婚晚育 近20年巴西35岁以上孕妇增加65%
查看>>
读书:为了那个美妙的咔哒声
查看>>
jsp改造之sitemesh注意事项
查看>>
iOS 9.0之后NSString encode方法替换
查看>>
ASMFD (ASM Filter Driver) Support on OS Platforms (Certification Matrix). (文档 ID 2034681.1)
查看>>
CRM Transaction处理中的权限控制
查看>>
[转]linux创建链接文件的两种方法
查看>>