MakeWeb Powered by JavaCC
いきなり挫折ぎみ。まず手始めに、パラグラフのコマンドだけを定義して試してみようとした。
/** ** MakeWeb **/ options { STATIC=false; } PARSER_BEGIN(MakeWeb) import java.io.*; public class MakeWeb { static StringBuffer sb = new StringBuffer(); public static void main(String args[]) { String line = null; try { try { MakeWeb parser = new MakeWeb(new FileReader("sample.txt")); parser.CalcUnit(); } catch (ParseException e) { System.out.println("### " + e.getMessage()); } } catch (IOException e) { System.out.println("### " + e.getMessage()); } System.out.println(sb.toString()); } } PARSER_END(MakeWeb) SKIP : { " "| "\t"| "\n"| "\r"| "\f" } TOKEN : { <ANOTHER: ~[] > } TOKEN : { <MR: "--" > | <P_BEGIN: "-(" > | <P_END: "-)" > | <PRE_BEGIN: "--(" > | <PRE_END: "--)" > | <PRE_BEGIN_ESC: "---(" > | <PRE_END_ESC: "---)" > } void CalcUnit() : { Token t = null; } { P() | PRE() | PRE_ESC() | t = <ANOTHER> { sb.append(t.image + "\n"); } } void P() : {} { <P_BEGIN> { sb.append("<p>" + "\n"); } ( ( <MR> { sb.append("</p><p>" + "\n"); } )* CalcUnit() )* <P_END> { sb.append("</p>" + "\n"); } } void PRE() : {} { <PRE_BEGIN> { sb.append("<pre>" + "\n"); } ( ( <MR> { sb.append("</pre><pre>" + "\n"); } )* CalcUnit() )* <PRE_END> { sb.append("</pre>" + "\n"); } } void PRE_ESC() : { Token t = null; } { <PRE_BEGIN_ESC> { sb.append("<pre>" + "\n"); } ( t = <ANOTHER> { sb.append("escape:" + t.image + "\n"); } )* <PRE_END_ESC> { sb.append("</pre>" + "\n"); } }
PとPREは良いのだけど、HTMLエスケープするコマンドPRE_ESCを定義できない。
エスケープ中は処理を行わずに、進めたいのだけど、例えば
---( --( -( abc -- def -) --) ---)
とsample.txtがある場合、2行目の--(でエラーになってしまう。
MakeWebの処理としては、---(と---)の間は、すべてのトークンを
( t = <ANOTHER> { sb.append("escape:" + t.image + "\n"); } )*
に送り込みたいのだけど、