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的数据拷贝到返回类的成员中,{ }中为自定义代码。这样逐级使用,可以完成语法分析的绝大部工作,后续进行一些语法验证即可。
'}'
;