ANTLR 3中wikitext到HTML的工作示例

ANTLR 3中wikitext到HTML的工作示例,antlr,mediawiki,stringtemplate,wikitext,creole,Antlr,Mediawiki,Stringtemplate,Wikitext,Creole,我正试图在Antlr3中充实一个从wikitext到HTML的翻译程序,但我一直被卡住 你知道我可以检查的工作示例吗?我尝试了MediaWiki ANTLR语法和Wiki克里奥尔语法,但我无法让它们在ANTLR 3中生成lexer&parser 以下是我尝试使用的两种语法的链接: 我无法让这两个工具中的任何一个生成我的Java Lexer和解析器。(我使用ANTLR3作为Eclipse插件)。MediaWiki需要很长时间来构建,然后在某个时候抛出OutOfMemory异常。另一个有错误

我正试图在Antlr3中充实一个从wikitext到HTML的翻译程序,但我一直被卡住

你知道我可以检查的工作示例吗?我尝试了MediaWiki ANTLR语法和Wiki克里奥尔语法,但我无法让它们在ANTLR 3中生成lexer&parser

以下是我尝试使用的两种语法的链接:

我无法让这两个工具中的任何一个生成我的Java Lexer和解析器。(我使用ANTLR3作为Eclipse插件)。MediaWiki需要很长时间来构建,然后在某个时候抛出OutOfMemory异常。另一个有错误,我不知道如何调试

编辑:好的,我有一个非常基本的语法:

语法维基文本;
选择权{
//输出=AST;
//ASTLabelType=CommonTree;
输出=模板;
语言=Java;
}
文件:行(NL行?*);
行:横线|列表|标题|段落;
/*水平线*/
水平线:hr线;
/*列表*/
列表:无序列表|有序列表;
无序列表:“*”+内容;
有序列表:“#”+内容;
/*标题*/
标题:标题1 |标题2 |标题3 |标题4 |标题5 |标题6;
标题1:H1平原H1;
头2:H2普通H2;
标题3:H3平原H3;
头部4:H4普通H4;
标题5:H5平原H5;
头部6:H6普通H6;
/*段落*/
第段:内容;
内容:(格式化链接)+;
/*链接*/
链接:外部链接|内部链接;
外部链接:“[”外部链接uri(“|”外部链接标题)?”];
内部链接:'['内部链接参考('.'内部链接标题)?']';
外部链接uri:字符+;
外部链接标题:普通;
内部链接参考:普通;
内部链接标题:普通;
/*粗体和斜体*/
格式:粗体斜体|粗体|斜体|普通;
粗体斜体:粗体斜体普通粗体斜体;
粗体:粗体素色粗体;
斜体:斜体普通斜体;
/*纯文本*/
普通:(字符|空格)+;
/**
*LEXER规则
* --------------------------------------------------------------------------
*/
hr行:'-''-'+;
H1:“=”;
H2:'=';
H3:'=';
H4:'=';
H5:'==';
H6:'=======';
粗体斜体:'\'\'\'\'''\'''''';
粗体:'\'\'';
斜体:'\'\'';
NL:“\r”?“\n”;
字符:“!”|”"' | '#' | '$' | '%' | '&'
|       '*' | '+' | ',' | '-' | '.' | '/'
|       ':' | ';' | '?' | '@' | '\\' | '^' | '_' | '`' | '~'
|“0”.“9”|“A”.“Z”|“A”.“Z”
|'\u0080'..'\u7fff'
|       '(' | ')'
|       '\'' | '' | '=' | '[' | ']' | '|' 
;
空格:“”|“\t”;

我不清楚如何输出HTML。我一直在研究StringTemplate,但我不知道如何构造我的模板。具体来说,哪个模板在语法中的位置。你能帮我举个简短的例子吗?

好的,在你编辑之后,我有几点建议

正如我在评论中所说,为这样一种语言编写语法几乎是不可能的。至少,尝试一次性完成。我认为唯一可行的方法是使用多个解析器,其中第一个“解析阶段”将非常“粗略地”解析wiki源“。例如:
将标记为:
表:'{124;'.'.'}'
,然后您将创建另一个正确解析此表的解析器。”。在一个解析器中执行此操作将导致解析器规则中存在相当多的歧义

关于发出HTML代码,使用StringTemplate确实是一种“正确”的方法,但鉴于您对ANTLR本身相当陌生,我会保持简单。您可以在解析器类中创建一个StringBuilder属性,该属性将在解析源文件时收集所有HTML代码。通过使用
{
}
包装代码,可以将代码嵌入ANTLR规则中

下面是一个快速演示:

grammar T;

@parser::members {

  // an attribute that is only available in your 
  // parser (so only in parser rules!)
  protected StringBuilder htmlBuilder = new StringBuilder();
}

// Parser rules
parse
  :  atom+ EOF
  ;

atom
  :  header
  |  Any    {htmlBuilder.append($Any.text);} // append the text from 'Any' token
  ;

header
  :  H3 h3Content H3 {htmlBuilder.append("<h3>" + $h3Content.text + "</h3>");}
  |  H2 h2Content H2 {htmlBuilder.append("<h2>" + $h2Content.text + "</h2>");}
  |  H1 h1Content H1 {htmlBuilder.append("<h1>" + $h1Content.text + "</h1>");}
  ;

h3Content : ~H3*; // match any token except H3, zero or more times
h2Content : ~H2*; //        "               H2          "
h1Content : ~H1*; //        "               H1          "

// Lexer rules    
H3 : '===';
H2 : '==';
H1 : '=';

// Fall through rule: if non of the above 
// lexer rules matched, this one will.
Any
  :  .
  ;
然后创建一个小类来测试解析器:

import org.antlr.runtime.*;

public class Main {
    public static void main(String[] args) throws Exception {

        // the source to be parsed
        String source = 
                "= header 1 =             \n"+
                "                         \n"+
                "some text here           \n"+
                "                         \n"+
                "=== header level 3 ===   \n"+
                "                         \n"+
                "and some more text         ";

        ANTLRStringStream in = new ANTLRStringStream(source);
        TLexer lexer = new TLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        TParser parser = new TParser(tokens);

        // invoke the start-rule in your parser
        parser.parse();

        // print the contents of your parser's StringBuilder
        System.out.println(parser.htmlBuilder);
    }
}
然后编译所有源文件:

javac -cp antlr-3.2.jar *.java
最后,运行您的主类

// *nix & MacOS
java -cp .:antlr-3.2.jar Main

// Windows
java -cp .;antlr-3.2.jar Main
将在控制台上打印以下内容:

<h1> header 1 </h1>             

some text here           

<h3> header level 3 </h3>   

and some more text  
标题1
这里有一些文字
标题级别3
还有一些文字
但是,再一次,如果你可以自由选择另一种语言来解析,我会这样做,并且忘记解析这个可怕的Wiki东西


不管怎样,无论你做什么,祝你好运

你的确切意思是什么语法?你可以发布它们(或者发布链接,如果它们很大的话)?为什么不能生成lexer和parser?你收到错误信息了吗?如果是这样,你能发布它们吗?巴特,我已经添加了一些细节。你自己生成解析器有什么具体原因吗?为什么不使用呢?是的,我有一个翻译设计课程,我需要一个起点。如果你的课程不要求你使用MadiaWiki翻译,我会选择其他的。MediaWiki语言不能很好地翻译为(E)BNF,这可能就是为什么它的语法如此之少的原因,而且正如您可能已经注意到的,确实存在的尝试是极其笨拙的令人憎恶的当然,祝你好运!非常感谢,你的评论真的很有帮助!
// *nix & MacOS
java -cp .:antlr-3.2.jar Main

// Windows
java -cp .;antlr-3.2.jar Main
<h1> header 1 </h1>             

some text here           

<h3> header level 3 </h3>   

and some more text