文本协议解析

来源:互联网 发布:好听女装淘宝店铺名字 编辑:程序博客网 时间:2024/04/29 18:13
Antlr 可以用于编译器的语法解析,同样我们可以使用 Antlr 来解析 文本协议。
 
一、工作流程
 
第一步,根据 *.g 文件的词法,将文本协议分成很多个小块。
 
在没有特定“词法规则”时,antlr会跳过 空格、换行等。如果我们在自己的“词法规则”中定义了 空格、换行等的识别,可能导致antlr无法正常工作。
 
写词法规则时,要保证不能有二义性。
 
第二步,根据词法分析输出的小块,逐个同“语法规则”进行匹配。
 
二、工具软件
 
Antlrwork:Java 开发的调试环境,需要JRE支持
 
Antlr plug:eclipse的插件,Java进行二次开发时需要的文件。
 
Antlr3.exe:.net开发的 代码生成器,直接将 *.g 文件作为输入,生成响应的代码。
 
Antlr3.Runtime:.net二次开发需要的文件。
 
三、语法
 
1、格式
 
小写字母开头的规则为“语法规则”,否则为“词法规则”。
 
规则名后使用 “”开始定义规则,以“”结束规则定义(包含其它形式的语句)。
 
 
2、规则
 
grammar LDF21;             // grammar 定义名称,需要同文件名一致
 
options                    // 全局选项,每个规则也可以设定一些选项    
  {
      language = CSharp3;     // 输出语言为 CSharp3
      ...
  }
 
@header                     // 生成的语法文件中 自定义的头文件
  {
  using System;    
  }
 
  lexer::@header              // 生成的词法文件中 自定义的头文件
  {
  using System;
  }
 
@members                   // 生成的语法文件中 自定义代码
  {
 
  }
 
⑤ public lin_ldf_entry...   // 入口规则,这样才能开始所有的语法分析,所有语法应从此处发散,public 用在 C#中,申明入口方法为可见的。
 
⑥ slave_resp
  [int i]                   // 参数
  returns[int num]          // 返回值,定义后,响应子方法返回类将添加成员变量
  @init                     // 初始化操作,将直接添加到方法中。
  {
    $num = ...              // 使用 返回类 的成员变量
  }
  : 'SlaveResp' ':' INT
    '{'
    'SlaveRespB0' ',' b0 = INT ';'{$num = Convert.ToInt32(bo.Text);}
 
// 将子规则bo的数据拷贝到返回类的成员中,{ }中为自定义代码。这样逐级使用,可以完成语法分析的绝大部工作,后续进行一些语法验证即可。
    '}'
  ;