我最终通过使用 RLex http://raa.ruby-lang.org/project/ruby-lex/ 解决了这个问题,这是 lex 的 ruby 版本,语法如下:
%{
#define 数字 257
#define OPTOK 258
#define IDENT 259
#define OPETOK 260
#define CLSTOK 261
#定义CLTOK 262
#define 浮点数 263
#define FIXNUM 264
#定义字265
#define STRING_DOUBLE_QUOTE 266
#define STRING_SINGLE_QUOTE 267
#define TAG_START 268
#定义 TAG_END 269
#define TAG_SELF_CONTAINED 270
#define ERB_BLOCK_START 271
#define ERB_BLOCK_END 272
#define ERB_STRING_START 273
#define ERB_STRING_END 274
#define TAG_NO_TEXT_START 275
#define TAG_NO_TEXT_END 276
#define WHITE_SPACE 277
%}
数字 [0-9]
空白的 [ ]
字母 [A-Z-Z]
name1 [A-Za-z_]
名称2 [A-Za-z_0-9]
valid_tag_character [A-Za-z0-9"'=@_():/ ]
忽略标签样式|脚本
%%
{空白}+"\n" { 返回 [ WHITE_SPACE, yytext ] }
"\n"{空白}+ { 返回 [ WHITE_SPACE, yytext ] }
{空白}+"\n"{空白}+ { 返回 [ WHITE_SPACE, yytext ] }
"\r" { 返回 [ WHITE_SPACE, yytext ] }
"\n" { return[ yytext[0], yytext[0..0] ] };
"\t" { return[ yytext[0], yytext[0..0] ] };
^{空白}+ { 返回 [ WHITE_SPACE, yytext ] }
{空白}+$ { 返回 [ WHITE_SPACE, yytext ] };
"" { 返回 [TAG_NO_TEXT_START, yytext] }
"" { 返回 [TAG_NO_TEXT_END, yytext] }
“”{返回[TAG_SELF_CONTAINED,yytext]}
“”{返回[TAG_SELF_CONTAINED,yytext]}
"" { 返回 [ TAG_START, yytext ] }
"" { 返回 [TAG_END, yytext ] }
"" { 返回 [ERB_BLOCK_END, yytext ] }
"" { 返回 [ERB_STRING_END, yytext] }
{字母}+ { 返回 [ WORD, yytext ] }
\".*\" { 返回 [ STRING_DOUBLE_QUOTE, yytext ] }
'.*' { 返回 [ STRING_SINGLE_QUOTE, yytext ] }
. { 返回 [ yytext[0], yytext[0..0] ] }
%%
这不是一个完整的语法,但出于我的目的,定位和重新发送文本,它有效。我把那个语法和一小段代码结合起来:
text_handler = MakeYourOwnCallbackHandler.new
l = Erblex.new
l.yyin = File.open(file_name, "r")
循环做
a,v = l.yylex
如果 a == 0 则中断
如果(一个