我最终通过使用 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 则中断
如果(一个<字)
text_handler.character(v.to_s, a)
别的
案例一
当 WORD
text_handler.text(v.to_s)
当 TAG_START
text_handler.start_tag(v.to_s)
当TAG_END
text_handler.end_tag(v.to_s)
当空白
text_handler.white_space(v.to_s)
当 ERB_BLOCK_START
text_handler.erb_block_start(v.to_s)
当 ERB_BLOCK_END
text_handler.erb_block_end(v.to_s)
当 ERB_STRING_START
text_handler.erb_string_start(v.to_s)
当 ERB_STRING_END
self.text_handler.erb_string_end(v.to_s)
当 TAG_NO_TEXT_START
text_handler.ignorable_tag_start(v.to_s)
当TAG_NO_TEXT_END
text_handler.ignorable_tag_end(v.to_s)
当 STRING_DOUBLE_QUOTE
text_handler.string_double_quote(v.to_s)
当 STRING_SINGLE_QUOTE
text_handler.string_single_quote(v.to_s)
当 TAG_SELF_CONTAINED
text_handler.tag_self_contained(v.to_s)
结尾
结尾
结尾