当前位置:文档之家› ragel学习

ragel学习

Ragel学习笔记
解决的问题
采用一个连续的可能庞大的正则表达式,可以有一些分块式action,或者只是判断某一串符合此表达式。

采用解决问题模型为有限状态机。

语法
嵌入C, C++, Objective-C, D, Go,Java and Ruby.
多行代码
%%{
… …
}%%
单行代码%%
实例代码
#include <string.h>
#include <stdio.h>
%%{
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> = <expression>;
名为name的state直到定义实例化(被引用时(下一个为:=形式))才生成,该语句类似一个类的定义
状态机实例化
<name> := <expression>;
该语句产生状态机的一个状态,名为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]
---- xdigit ---- Hexadecimal digits. [0-9A-Fa-f]
---- cntrl ---- Control characters. 0..31
---- graph ---- Graphical characters. [!-~]
---- print ---- Printable characters. [ -~]
---- punct ---- Punctuation. Graphical characters that are not alphanumerics. [!-/:-@[-`-----~] ---- space ---- Whitespace. [\t\v\f\n\r ]
---- zlen ---- Zero length string. ""
---- empty ---- Empty set. Matches nothing. ^any
优先级
集合
(1)expr|expr
(2) expr&expr
(3) expr-expr
(4) expr--expr
这一语句与expr-(any*expr any*)作用相同,expr代表某一语句(5)expr.expr
main := /[^\n]*\n/* . 'EOF\n';。

…。

命令
-V: 可视化
-S –M 检查
-X 编译状态机为xml格式User Actions
action ActionName {
/* Code an action here. */ count += 1;
}
Enter action expr>action
Finishing action expr@action
All transition action Main:=(…m1‟|…m2‟)$A
Leaving action
Expr%action。

相关主题