wikiページのコンバートをraccでやるのだプロジェクト
現在還元/シフト衝突が一つ,preで起きている。
まだまだっすね。
class Wikip prechigh left Bold Underline Italics Link Footnote Largefont List left Word Colon Url Mail preclow options no_result_var rule target : page { "<xml>\n#{val[0]}</xml>" } #ファイルの末端処理 page : # ファイルの開始処理 | page EOL {"#{val[0]}<br>\n"} # ブランク行 | page nodes EOL {"#{val[0]}#{val[1]}<br>\n"} #なんか入っているとき | page Headline nodes EOL {"#{val[0]}<h#{val[1]}>#{val[2]}</h#{val[1]}>\n"} #行見出し | page EnumHeadline nodes EOL {"#{val[0]}<h#{val[1]}>#{@head[val[1]]+=1}.#{val[2]}</h#{val[1]}>\n"} #行見出し | page pre {"#{val[0]}<pre>#{val[1]}</pre>\n"} #pre | page list {"#{val[0]}<ul>#{val[1]}</ul>\n"} #list nodes : node {val[0]} # nodesは一つ以上のnodeのリスト | nodes node {"#{val[0]}#{val[1]}"} node : Word | Colon | Url {"<a href=\"#{val[0]}\">#{val[0]}</a>"} | Mail {"<a href=\"mailto:#{val[0]}\">#{val[0]}</a>"} | Bold nodes Bold {"<bold>#{val[1]}</bold>"} | Underline nodes Underline {"<udl>#{val[1]}</udl>"} | Italics nodes Italics {"<ita>#{val[1]}</ita>"} | Footnote nodes Footnote {"<note>#{val[1]}</note>"} | Largefont nodes Largefont {"<largefont>#{val[1]}</largefont>"} | Link nodes Link {"<link>#{val[1]}</link>"} pre : PRE EOL {"#{val[0]}\n"} | pre PRE EOL {"#{val[0]}#{val[1]}\n"} list : List nodes EOL {"<li>#{val[1]}</li>\n"} # だめだこんなのじゃもう一度考え直そう | List list {val[1]} ---- header ---- # parser : generated by racc ---- inner ---- def evalute(str) @q = [] str = "\n#{str}" until str == nil || str.empty? case str when /\A:/ @q.push [:Colon, $&] when /\Ahttp:[^a-zA-Zぁ-ん]+/ @q.push [:Url, $&] when /\Amailto:[^a-zA-Zぁ-ん]+/ @q.push [:Mail, $&] when /\A'''/ @q.push [:Italics, $&] when /\A''/ @q.push [:Bold, $&] when /\A__/ @q.push [:Underline, $&] when /\A""/ @q.push [:Largefont, $&] when /\A(\[\[|\]\])/ @q.push [:Link, $&] when /\A(\(\(|\)\))/ @q.push [:Footnote, $&] when /\A.+?(?=['_"\[\]\(\)]{2,}|\n|http:|mail:|:)/ @q.push [:Word, $&] when /\A\n/ # 改行を発見したときの行動 @q.push [:EOL, "\n"] str = $' case str # この辺からがスキャナのくせに構文解析っぽい動き when /\A ([^\n]+)/ # 先頭空行はpre @q.push [:PRE , $1] # 半角スペースは無視する when /\A(\-+)/ $1.size.times{@q.push [:List, '-']} when /\A(\*+)/ @q.push [:EnumHeadline, $1.size] when /\A(\++)/ @q.push [:Headline, $1.size] when /\A/ # $'を設定するための処理 end end str = $' end @q.push([false,'$']) p @q @head = [0,0,0,0,0,0,0,0,0,0] #こんなとこで変数宣言してよいのだろうか? @yydebug=true do_parse end def next_token @q.shift end ---- footer ---- page = Wikip.new begin puts page.evalute($stdin.read) rescue ParseError p @q puts 'parse error' end