ragel学习

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]

相关文档
最新文档