ragel学习
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Ragel学习笔记
解决的问题
采用一个连续的可能庞大的正则表达式,可以有一些分块式action,或者只是判断某一串符合此表达式。采用解决问题模型为有限状态机。
语法
嵌入C, C++, Objective-C, D, Go,Java and Ruby.
多行代码
%%{
… …
}%%
单行代码%%
实例代码
#include
#include
%%{
machine foo;
main :=
( 'foo' | 'bar' )
0 @{ res = 1; };
}%%
%% write data;
int main( int argc, char **argv )
{
int cs, res = 0;
if ( argc > 1 ) {
char *p = argv[1];
char *pe = p + strlen(p) + 1;
%% write init;
%% write exec;
}
printf("result = %i\n", res );
return 0;
}
状态机名
machine fsm_name;
必须在块开头注明,如上例。如果没注明则用先前使用的,如没有则报错。可以采用多文件编译include为关键字导入文件。
定义语句
名为name的state直到定义实例化(被引用时(下一个为:=形式))才生成,该语句类似一个类的定义
状态机实例化
该语句产生状态机的一个状态,名为main的状态为初始start状态。
%% write init // 该命令设置cs (current_state) 为main的状态,即为start状态
如果没有main 则最近一个实例化的状态即为开始状态。
在外部执行控制语句可以通过设置cs来设置状态机,内部执行,采用fcall fgoto fnext实现状态切换。
导入ragel代码
include FsmName "inputfile.rl";
如果没名会与当前状态机同名,如果没输入文件,则导入FsmName,检索路径与当前文件相同,可以通过-I命令增加include 检索路径,同makefile。
导入定义
import "inputfile.h";
文件内容形如:(单引号类似命令标记)定义name 为number(纯数字) 或者lit_string(字符串)
name '=' number
name '=' lit_string
'define' name number
'define' name lit_string
如果输入文件为一个ragel 程序则忽略所有tokens,检索路径与当前文件相同,可以通过-I 命令增加import检索路径,同include。
Ragel块解析词典语法规则
(1) # 单行注释
(2) “” …‟ // [],四种符号作为语句分隔符,在其中\0 \a \b \t \n \v \f \r字符可以被读取,/ 反斜杠为转移字符,例如出现在行尾则表示连接下一行,正则表达式中作为转移字符或者终止符。也有一些不支持的操作符。
(3) {} 主代码中表示一个action,代码拷贝,类似于inline
(4) [+-]?[0-9]+ 表示一个可以有符号的十进制整数。0x[0-9A-Fa-f]+表示十六进制整数
(5) 关键词access, action, alphtype, getkey, write, machine and include.
(6) [a-zA-Z_][a-zA-Z_0-9]*标示符:字母或者_开头
(7) 空格作为代码间分隔符(not a state)
状态机ABC
(1) …hello‟ 串联状态机h to o 5个字符作为开始到结束6种状态的转换
(2) “hello” 同上
(3) [hello] 或语句同正则表达式hello五个字符中任意一个。[^H]表示非H的字符
(4) 42 一个状态转变,short的-32768-32767
(5) /simple_regex/ 正则表达式,其中any代表.或者[]的集合,[a-z]*是有意义的。/GET/i表示GET大小写不敏感正则表达式。表达式是不能太复杂
/ab*[c-z].*[123]/状态机如下,其中DEF代表对应的状态转移因子。
(6) builtin_machine
定义如下二元状态的内置状态变量。
---- any ---- Any character in the alphabet.
---- ascii ---- Ascii characters. 0..127
---- extend ---- Ascii extended characters. This is the range -128..127 for signed alphabets
and the range 0..255 for unsigned alphabets.
---- alpha ---- Alphabetic characters. [A-Za-z]
---- digit ---- Digits. [0-9]
---- alnum ---- Alpha numerics. [0-9A-Za-z]
---- lower ---- Lowercase characters. [a-z]
---- upper ---- Uppercase characters. [A-Z]