ANTLR 3中wikitext到HTML的工作示例
我正试图在Antlr3中充实一个从wikitext到HTML的翻译程序,但我一直被卡住 你知道我可以检查的工作示例吗?我尝试了MediaWiki ANTLR语法和Wiki克里奥尔语法,但我无法让它们在ANTLR 3中生成lexer&parser 以下是我尝试使用的两种语法的链接: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异常。另一个有错误
语法维基文本;
选择权{
//输出=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