使用ANTLR创建markdown解析器

时间:2016-02-11 09:10:45

标签: markdown antlr4

我是一名ANTLR新手。我正在尝试实现HTML转换器的降价。

这些是我编码的语法和相关文件。

语法

grammar markdown;

prog    :   stat+;

stat    :   main_heading
        |   sub_heading
        |   custom
        |   italic
        |   bold
        |   bolditalic
        |   text
        |   WS
        ;

text    :   TEXT|SPACE;

main_heading: text* WS '='+ WS+;

sub_heading : WS? text* WS '-'+ WS+;

custom      : '#'+ text* WS; //to support custom headings

italic  :   ('*'stat*'*')|('_'stat*'_');

bold    :   ('**'stat*'**')|('__'stat*'__');

bolditalic: ('***' stat* '***');

TEXT    :   [a-zA-Z0-9]+;

SPACE   :   ' ';

WS      :   [\t\r\n]+;

访客方式

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;

import java.util.Objects;

public class markdownEvaluator extends markdownBaseVisitor {


    @Override
    public Object visitItalic(markdownParser.ItalicContext ctx) {
        int i=1;
        System.out.print("<i>");
        while(ctx.getChild(i)!=null)
        {
            visit(ctx.getChild(i));
            i++;
        }
        System.out.print("</i>");
        return null;
    }

    @Override
    public Object visitBold(markdownParser.BoldContext ctx) {
        int i=1;
        System.out.print("<strong>");
        while(ctx.getChild(i)!=null)
        {
            visit(ctx.getChild(i));
            i++;
        }
        System.out.print("</strong>");
        return null;
    }

    @Override
    public Object visitBolditalic(markdownParser.BolditalicContext ctx) {
        int i=1;
        System.out.print("<strong><i>");
        while(ctx.getChild(i)!=null)
        {
            visit(ctx.getChild(i));
            i++;
        }
        System.out.print("</i></strong>");
        return null;
    }

    @Override
    public Object visitSub_heading(markdownParser.Sub_headingContext ctx) {
        int i=0;
        System.out.print("<h2>");
        while(ctx.getChild(i)!=null)
        {
            visit(ctx.getChild(i));
            i++;
        }
        System.out.print("</h2>");
        System.out.println();
        return null;
    }

    @Override
    public Object visitCustom(markdownParser.CustomContext ctx) {
        int headernumber = 0;
        int i=0;
        while(Objects.equals(ctx.getChild(i).getText(), "#"))
        {
            headernumber++;
            i++;
        }
        System.out.print("<h"+String.valueOf(headernumber)+">");
        while (ctx.getChild(i)!=null)
        {
            visit(ctx.getChild(i));
            i++;
        }
        System.out.print("</h"+String.valueOf(headernumber)+">");
        return null;
    }

    @Override
    public Object visitMain_heading(markdownParser.Main_headingContext ctx) {
        int i=0;
        System.out.print("<h1>");
        while(ctx.getChild(i)!=null)
        {
            visit(ctx.getChild(i));
            i++;
        }
        System.out.print("</h1>");
        System.out.println();
        return null;
    }

    @Override
    public Object visitText(markdownParser.TextContext ctx) {
        System.out.print(ctx.getText());
        return null;
    }
}
  1. 我的降价语法有多正确?是否有更好的方法来指定它?

  2. 如何改进代码的生成方式?目前我正在使用while循环来检查节点是否有孩子,然后相应地做出响应。有没有更好的方法来做到这一点? ANTLR支持的其他方法是否可用于创建相同的效果?

  3. 我们希望将HTML代码写入文件。那么有没有办法自动创建文件并写&lt; html&gt;当程序开始解析并附加&lt; / html&gt;并在解析器完成解析时关闭文件?

  4. 感谢。

0 个答案:

没有答案