Parsing ANTLR的BibTex语法

Parsing ANTLR的BibTex语法,parsing,antlr,grammar,bibtex,Parsing,Antlr,Grammar,Bibtex,我正在寻找一个在ANTLR的bibtex语法在一个爱好项目中使用。我不想把时间花在写ANTLR语法上(这对我来说可能需要一些时间,因为它需要学习曲线)。所以我非常感谢你的指点 注意:我找到了bison和yacc的bibtex语法,但找不到antlr的bibtex语法 编辑:正如巴特指出的那样,我不需要解析引用字符串中的前导码和tex。这里有一个(非常)基本的BibTex语法,它发出一个AST(与简单的解析树相反): 语法BibTex; 选择权{ 输出=AST; ASTLabelType=Comm

我正在寻找一个在ANTLR的bibtex语法在一个爱好项目中使用。我不想把时间花在写ANTLR语法上(这对我来说可能需要一些时间,因为它需要学习曲线)。所以我非常感谢你的指点

注意:我找到了bison和yacc的bibtex语法,但找不到antlr的bibtex语法

编辑:正如巴特指出的那样,我不需要解析引用字符串中的前导码和tex。

这里有一个(非常)基本的BibTex语法,它发出一个AST(与简单的解析树相反):

语法BibTex;
选择权{
输出=AST;
ASTLabelType=CommonTree;
}
代币{
BIBTEXFILE;
类型;
一串
序言;
评论;
标签;
海螺;
}
////////////////////////////////解析器规则////////////////////////////////
作语法分析
:(条目(逗号?条目)*逗号?)?EOF->^(BIBTEXFILE条目*)
;
进入
:类型名称逗号标记CloseBrace->^(类型名称标记)
|StringType名称分配QuotedContent CloseBrace->^(字符串名称QuotedContent)
|序言类型内容右括号->^(序言内容)
|CommentType->^(CommentCommentType)
;
标签
:(标记(逗号标记)*逗号?->标签*
;
标签
:名称分配内容->^(标记名称内容)
;
内容
:concatable(concatable)*->^(concatable+)
|数
|括号内容
;
可凝固
:QuotedContent
|名字
;
////////////////////////////////Lexer规则////////////////////////////////
分配
:  '='
;
连接两个字符串
:  '#'
;
逗号
:  ','
;
拉环
:  '}'
;
引用内容
:“(~('\\'\''''{'\'}'\'''''''''''.')\\'.\'.\124;大括号内容)*'”
;
括号内容
:“{”((~('\\''.{'\'}'))\\'.\\'.\124;括号内容)*'}”
;
弦型
:“@'('s'|'s')('t'|'t')('r'|'r')('i'|'i')('n'|'n')('g'|'g')SP'{'
;
前导码类型
:‘’(‘p’|‘p’)(‘r’|‘r’)(‘e’|‘e’)(‘a’|‘a’(‘m’|‘m’)(‘b’|‘b’)(‘l’|‘l’(‘e’|‘e’)SP’{'
;
注释类型
:“@'('c'|'c')('o'|'o')('m'|'m')('m'|'m')('e'|'e')('n'|'n')('t'|'t')SP?大括号内容
|“%”~(“\r”|“\n”)*
;
类型
:“@”字母+SP?“{”
;
数
:位数+
;
名称
:字母(字母|数字|':'|'-')*
;
空间
:SP{skip();}
;
////////////////////////////////Lexer片段////////////////////////////////
碎片字母
:'a'…'z'
|“A”…“Z”
;
碎片数字
:  '0'..'9'
;
片段SP
:(“”|’\t’|’\r’|’\n’|’\f’)+
;  
(如果不需要AST,请删除所有
->
及其右侧的所有内容,并删除
选项{…}
标记{…}
块)

可使用以下类别进行测试:

import org.antlr.runtime.*;
导入org.antlr.runtime.tree.*;
导入org.antlr.stringtemplate.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
//解析文件“test.bib”
BibTexLexer lexer=新的BibTexLexer(新的ANTLRFileStream(“test.bib”);
BibTexParser parser=newbibtexparser(newcommontokenstream(lexer));
//您可以在代码中使用以下树
//见:http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1tree_1_1_common_tree.html
CommonTree=(CommonTree)parser.parse().getTree();
//打印我们的AST的点树
DOTTreeGenerator gen=新的DOTTreeGenerator();
StringTemplate st=gen.toDOT(树);
系统输出打印LN(st);
}
}
以及以下Bib输入示例(文件:
test.Bib
):

序言{ “\newcommand{\noopsort}[1]{}” #“\newcommand{\singleletter}[1]{#1}” } @字符串{ me=“巴特·基尔斯” } @注释{此处的一些注释} %或者这里有一些评论 @第{mrx05条, 作者=我#“X先生”, Title={Something Great}, publisher=“nob”#“ody”, 年份=2005年, x={{Bib}\TeX}, y=“{Bib}\TeX”, z=“{Bib}”#“\TeX”, }, @misc{patashnik bibtexing, 作者=“Oren Patashnik”, title=“BIBTEXing”, 年份=“1988” }%此处没有逗号 @techreport{presstudy2002, 作者=“Diessen博士,van R.J.和Steenbergen博士,J.F.”, title=“关于{DNEP}{P}项目的长期{T}erm{P}保留{S}研究”, institution=“IBM,荷兰国家图书馆”, year=“2002”, 月份=“12月”, } 运行演示 如果现在从语法生成解析器和词法分析器:

java-cp antlr-3.3.jar org.antlr.Tool BibTex.g
并编译所有
.java
源文件:

javac-cp antlr-3.3.jar*.java
最后运行
Main
类:

*尼克斯/马科斯
java-cp.:antlr-3.3.jar Main
窗户
java-cp;antlr-3.3.jar Main
您将在控制台上看到一些与以下AST对应的输出:

(单击要放大的图像,使用生成)


要强调的是:我没有正确地测试语法!我不久前写了它,从来没有在任何项目中真正使用过它。

你需要它有多准确/精确?序言可能很难解析,在引用或大括号的内容中,你可以正式嵌入“数学”这样的代码:
“text$2\times\pi$text“
,好的。你想解析所有这些,还是可以将前导码和引号(或括号)的内容标记为单个标记?嗨,巴特,谢谢你的指针。我不需要解析bibtex中的tex,而引号(或引号或括号)的文本也可以标记为单个标记。那么我可能就有你想要的了(也就是说,一种不那么精确的BibTex语法)。让我为您掸掸灰尘并编写一个小测试类。是一个处理BibTeX文件的完整库。应该不需要单独的语法,是吗?这看起来是一个很好的起点。我正在寻找Java BibTeX解析器,可以包含在Apache许可项目中。我