Markdown 使用ANTLR创建标记解析器

Markdown 使用ANTLR创建标记解析器,markdown,antlr4,Markdown,Antlr4,我是ANTLR的新手。我正在尝试实现一个标记为HTML的转换器 这些是我编写的语法和相关文件 语法 grammar markdown; prog : stat+; stat : main_heading | sub_heading | custom | italic | bold | bolditalic | text | WS

我是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;
    }
}
import org.antlr.v4.runtime.*;
导入org.antlr.v4.runtime.tree.*;
导入java.util.Objects;
公共类markdownEvaluator扩展markdownBaseVisitor{
@凌驾
公共对象访问权限(markdownParser.ItalicContext ctx){
int i=1;
系统输出打印(“”);
while(ctx.getChild(i)!=null)
{
访问(ctx.getChild(i));
i++;
}
系统输出打印(“”);
返回null;
}
@凌驾
公共对象visitBold(markdownParser.BoldContext ctx){
int i=1;
系统输出打印();
while(ctx.getChild(i)!=null)
{
访问(ctx.getChild(i));
i++;
}
系统输出打印(“”);
返回null;
}
@凌驾
公共对象visitBolditalic(markdownParser.BolditalicContext ctx){
int i=1;
系统输出打印();
while(ctx.getChild(i)!=null)
{
访问(ctx.getChild(i));
i++;
}
系统输出打印(“”);
返回null;
}
@凌驾
公共对象访问Sub_标题(markdownParser.Sub_headingContext ctx){
int i=0;
系统输出打印(“”);
while(ctx.getChild(i)!=null)
{
访问(ctx.getChild(i));
i++;
}
系统输出打印(“”);
System.out.println();
返回null;
}
@凌驾
公共对象visitCustom(markdownParser.CustomContext ctx){
int headernumber=0;
int i=0;
while(Objects.equals(ctx.getChild(i.getText(),“#”)中)
{
headernumber++;
i++;
}
系统输出打印(“”);
while(ctx.getChild(i)!=null)
{
访问(ctx.getChild(i));
i++;
}
系统输出打印(“”);
返回null;
}
@凌驾
公共对象访问Main_标题(markdownParser.Main_headingContext ctx){
int i=0;
系统输出打印(“”);
while(ctx.getChild(i)!=null)
{
访问(ctx.getChild(i));
i++;
}
系统输出打印(“”);
System.out.println();
返回null;
}
@凌驾
公共对象visitText(markdownParser.TextContext ctx){
System.out.print(ctx.getText());
返回null;
}
}
  • 我的降价语法有多正确?有没有更好的方法来指定它

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

  • 我们希望HTML代码被写入到一个文件中。那么,有没有一种方法可以在程序开始解析时自动创建文件并写入,在解析器完成解析时追加并关闭文件


  • 谢谢。

    将您的语法与现有语法进行比较,例如,并使用其测试用例来判断语法的正确性。您将在此处找到一组相当全面的测试: