@@ -0,0 +1,2274 @@
+package com.greenlaw110.rythm.internal.parser.build_in;%0A%0Aimport com.greenlaw110.rythm.exception.ParseException;%0Aimport com.greenlaw110.rythm.internal.Keyword;%0Aimport com.greenlaw110.rythm.internal.dialect.Rythm;%0Aimport com.greenlaw110.rythm.internal.parser.Directive;%0Aimport com.greenlaw110.rythm.internal.parser.ParserBase;%0Aimport com.greenlaw110.rythm.spi.IContext;%0Aimport com.greenlaw110.rythm.spi.IParser;%0Aimport com.greenlaw110.rythm.spi.Token;%0Aimport com.greenlaw110.rythm.utils.TextBuilder;%0Aimport com.stevesoft.pat.Regex;%0A%0A/**%0A * Parse @init%7Barg1 = %22%22;...%7D%0A */%0Apublic class InitCodeParser extends KeywordParserFactory %7B%0A%0A    private static final String R = %22(%25s%25s%5C%5Cs*(%5C%5C(%5C%5Cs*%5C%5C))?%5C%5Cs*((?@%7B%7D)))%22;%0A%0A    public InitCodeParser() %7B%0A    %7D%0A    %0A    protected String patternStr() %7B%0A        return R;%0A    %7D%0A    %0A    public IParser create(final IContext c) %7B%0A        return new ParserBase(c) %7B%0A            public TextBuilder go() %7B%0A                Regex r = reg(dialect());%0A                if (r.search(remain())) %7B%0A                    step(r.stringMatched().length());%0A                    String s0 = r.stringMatched(3);%0A                    s0 = s0.substring(1); // strip '%7B'%0A                    s0 = s0.substring(0, s0.length() - 1); // strip '%7D'%0A                    String s = s0;%0A                    return new Directive(s, c) %7B%0A                        @Override%0A                        public void call() %7B%0A                            c.getCodeBuilder().setInitCode(s);%0A                        %7D%0A                    %7D;%0A                %7D%0A                throw new ParseException(c.getTemplateClass(), c.currentLine(), %22Invalid @init syntax found. Correct usage: @init%7B/*your code come here*/%7D%22);%0A            %7D%0A        %7D;%0A    %7D%0A%0A    @Override%0A    public Keyword keyword() %7B%0A        return Keyword.INIT;%0A    %7D%0A%0A    public static void main(String%5B%5D args) %7B%0A        Regex r = new InitCodeParser().reg(new Rythm());%0A        String s = %22@init ( ) %7B%5Cn%5CtHello world!%5Cn@each X %7Babc;%7D %5Cn%7D xyz%22;%0A        if (r.search(s)) %7B%0A            String s0 = r.stringMatched(3);%0A            s0 = s0.substring(1); // strip '%7B'%0A            s0 = s0.substring(0, s0.length() - 1); // strip '%7D'%0A            System.out.println(r.stringMatched());%0A            System.out.println(s0);%0A        %7D%0A    %7D%0A%7D%0A

add missing source file