From 010f9c87bc04fbc7046f4b03c2305d8d6509b20f Mon Sep 17 00:00:00 2001 From: grammarware Date: Sun, 23 Dec 2012 16:58:43 +0100 Subject: [PATCH] preliminary parsing facility of BibTeX files: for now strings remain unstructured --- rascal/src/io/bibtex/Parser.rsc | 24 ++++++++++++++++++++++++ rascal/src/io/bibtex/Syntax.rsc | 25 +++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 rascal/src/io/bibtex/Parser.rsc create mode 100644 rascal/src/io/bibtex/Syntax.rsc diff --git a/rascal/src/io/bibtex/Parser.rsc b/rascal/src/io/bibtex/Parser.rsc new file mode 100644 index 0000000..3ab3898 --- /dev/null +++ b/rascal/src/io/bibtex/Parser.rsc @@ -0,0 +1,24 @@ +@contributor{Vadim Zaytsev - vadim@grammarware.net - SWAT, CWI} +module io::bibtex::Parser + +import io::bibtex::Syntax; +import ParseTree; +import String; +import IO; + +alias BibLib = list[BibEntry]; +alias BibEntry = tuple[str kind, str name, map[str,str] attrs]; + +public BibLib loc2bib(loc l) = str2bib(readFile(l)); +BibLib str2bib(str s) = library2list(parse(#BibLibrary,trim(replaceAll(s,"\uC2A0"," ")))); + +BibLib library2list(BibLibrary b) = [mapEntry(e) | OneBibEntry e <- b.es]; + +BibEntry mapEntry(OneBibEntry e) = <"","",mapKVs(e.pairs)>; + +map[str,str] mapKVs({BibPair ","}+ ps) = ("":"" | BibPair p <- ps); + +public void main() +{ + loc2bib(|home:///workspace/zaytsev.bib|); +} \ No newline at end of file diff --git a/rascal/src/io/bibtex/Syntax.rsc b/rascal/src/io/bibtex/Syntax.rsc new file mode 100644 index 0000000..07aaccf --- /dev/null +++ b/rascal/src/io/bibtex/Syntax.rsc @@ -0,0 +1,25 @@ +@contributor{Vadim Zaytsev - vadim@grammarware.net - SWAT, CWI} +module io::bibtex::Syntax + +layout L = WS; +lexical WS = [\uC2A0 \ \n\r\t]* !>> [\uC2A0 \ \n\r\t]; // note the nonbreakable space (0xC2A0 in Unicode) + +syntax OneBibEntry = BibEntryType kind "{" BibEntryName name "," {BibPair ","}+ pairs ","? "}"; +lexical BibEntryType = "@" [a-zA-Z]+ name; +lexical BibEntryName = ![,]+ >> [,]; +syntax BibPair = BibKey key "=" BibValue val; +lexical BibKey = [a-z]+; + +lexical BibValue + = BibValueQ + | BibValueC + | [a-zA-Z0-9]+ !>> [a-zA-Z0-9] + ; + +lexical BibValueQ = [\"] BQElement* [\"] ; +lexical BQElement = ![\"\\{}] | [\\] [\"\'`&$%a-zA-Z] | BibValueC; + +lexical BibValueC = [{] BCElement* [}]; +lexical BCElement = BibValueC | ![{}]; + +start syntax BibLibrary = OneBibEntry+ es;