我是一名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;
}
}
我的降价语法有多正确?是否有更好的方法来指定它?
如何改进代码的生成方式?目前我正在使用while循环来检查节点是否有孩子,然后相应地做出响应。有没有更好的方法来做到这一点? ANTLR支持的其他方法是否可用于创建相同的效果?
我们希望将HTML代码写入文件。那么有没有办法自动创建文件并写&lt; html&gt;当程序开始解析并附加&lt; / html&gt;并在解析器完成解析时关闭文件?
感谢。