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&#39;&#39;&#39;/
         @q.push [:Italics, $&]
       when /\A&#39;&#39;/
         @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.+?(?=[&#39;_"\[\]\(\)]{2,}|\n|http:|mail:|:)/
         @q.push [:Word, $&]
       when  /\A\n/               # 改行を発見したときの行動
         @q.push [:EOL, "\n"]
         str = $&#39;
         case str                # この辺からがスキャナのくせに構文解析っぽい動き
         when /\A ([^\n]+)/      # 先頭空行はpre
           @q.push [:PRE , $1]   # 半角スペースは無視する
         when /\A(\-+)/
           $1.size.times{@q.push [:List, &#39;-&#39;]}
         when /\A(\*+)/
           @q.push [:EnumHeadline, $1.size]
         when /\A(\++)/
           @q.push [:Headline, $1.size]
         when /\A/               # $&#39;を設定するための処理
         end
       end
       str = $&#39;
     end
     @q.push([false,&#39;$&#39;])
     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 &#39;parse error&#39;
 end