Markdown 使用ANTLR创建标记解析器
我是ANTLR的新手。我正在尝试实现一个标记为HTML的转换器 这些是我编写的语法和相关文件 语法Markdown 使用ANTLR创建标记解析器,markdown,antlr4,Markdown,Antlr4,我是ANTLR的新手。我正在尝试实现一个标记为HTML的转换器 这些是我编写的语法和相关文件 语法 grammar markdown; prog : stat+; stat : main_heading | sub_heading | custom | italic | bold | bolditalic | text | WS
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;
}
}
谢谢。将您的语法与现有语法进行比较,例如,并使用其测试用例来判断语法的正确性。您将在此处找到一组相当全面的测试: