我終於結束了使用RLex,http://raa.ruby-lang.org/project/ruby-lex/,法的紅寶石版本解決這個問題用以下語法:
%{
#define NUM 257
#define OPTOK 258
#define IDENT 259
#define OPETOK 260
#define CLSTOK 261
#define CLTOK 262
#define FLOAT 263
#define FIXNUM 264
#define WORD 265
#define STRING_DOUBLE_QUOTE 266
#define STRING_SINGLE_QUOTE 267
#define TAG_START 268
#define 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
%}
digit [0-9]
blank [ ]
letter [A-Za-z]
name1 [A-Za-z_]
name2 [A-Za-z_0-9]
valid_tag_character [A-Za-z0-9"'[email protected]_():/ ]
ignore_tags style|script
%%
{blank}+"\n" { return [ WHITE_SPACE, yytext ] }
"\n"{blank}+ { return [ WHITE_SPACE, yytext ] }
{blank}+"\n"{blank}+ { return [ WHITE_SPACE, yytext ] }
"\r" { return [ WHITE_SPACE, yytext ] }
"\n" { return[ yytext[0], yytext[0..0] ] };
"\t" { return[ yytext[0], yytext[0..0] ] };
^{blank}+ { return [ WHITE_SPACE, yytext ] }
{blank}+$ { return [ WHITE_SPACE, yytext ] };
"" { return [ TAG_NO_TEXT_START, yytext ] }
"" { return [ TAG_NO_TEXT_END, yytext ] }
"" { return [ TAG_SELF_CONTAINED, yytext ] }
"" { return [ TAG_SELF_CONTAINED, yytext ] }
"" { return [ TAG_START, yytext ] }
"" { return [ TAG_END, yytext ] }
"" { return [ ERB_BLOCK_END, yytext ] }
"" { return [ ERB_STRING_END, yytext ] }
{letter}+ { return [ WORD, yytext ] }
\".*\" { return [ STRING_DOUBLE_QUOTE, yytext ] }
'.*' { return [ STRING_SINGLE_QUOTE, yytext ] }
. { return [ yytext[0], yytext[0..0] ] }
%%
這不是一個完整的語法,但爲我的目的,找到並重新發布文本,它的工作。我把這個語法與這段小代碼結合在一起:
text_handler = MakeYourOwnCallbackHandler.new
l = Erblex.new
l.yyin = File.open(file_name, "r")
loop do
a,v = l.yylex
break if a == 0
if(a < WORD)
text_handler.character(v.to_s, a)
else
case a
when WORD
text_handler.text(v.to_s)
when TAG_START
text_handler.start_tag(v.to_s)
when TAG_END
text_handler.end_tag(v.to_s)
when WHITESPACE
text_handler.white_space(v.to_s)
when ERB_BLOCK_START
text_handler.erb_block_start(v.to_s)
when ERB_BLOCK_END
text_handler.erb_block_end(v.to_s)
when ERB_STRING_START
text_handler.erb_string_start(v.to_s)
when ERB_STRING_END
self.text_handler.erb_string_end(v.to_s)
when TAG_NO_TEXT_START
text_handler.ignorable_tag_start(v.to_s)
when TAG_NO_TEXT_END
text_handler.ignorable_tag_end(v.to_s)
when STRING_DOUBLE_QUOTE
text_handler.string_double_quote(v.to_s)
when STRING_SINGLE_QUOTE
text_handler.string_single_quote(v.to_s)
when TAG_SELF_CONTAINED
text_handler.tag_self_contained(v.to_s)
end
end
end
你有與Lexer.rb/Erblex.rb任何麻煩由rlex生成的不完整?我已經在OS X和Ubuntu上試過了,但是生成的詞法分析器RB在一個大的'case'/'when'塊中突然結束。我已經嘗試過'rlex grammar'和'rlex --output LexerClassName grammar',其中'語法'對應於一個名爲'grammar.rl'的文件。我有Ruby 1.8.7。 – 2010-10-22 20:35:43
嗨,莎拉,我確實有這個問題。我向Rlex所有者提交了一個錯誤修復程序。如果您有興趣,我可以向您發送補丁文件,但這是一個錯誤,您必須修復紅外。 – 2010-11-10 19:08:38
你能以某種方式發佈補丁嗎? – user43685 2010-12-17 17:30:31