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");
    }
)*

に送り込みたいのだけど、では上手にマッチしてくれない。--(ってTOKEN定義されてないのに使っちゃダメじゃないかあ、と言われてしまうのである。