summaryrefslogtreecommitdiff
path: root/skribe/tools/skribebibtex/stklos
diff options
context:
space:
mode:
Diffstat (limited to 'skribe/tools/skribebibtex/stklos')
-rw-r--r--skribe/tools/skribebibtex/stklos/Makefile62
-rw-r--r--skribe/tools/skribebibtex/stklos/bibtex-lex.l75
-rw-r--r--skribe/tools/skribebibtex/stklos/bibtex-parser.y117
-rw-r--r--skribe/tools/skribebibtex/stklos/main.stk118
4 files changed, 372 insertions, 0 deletions
diff --git a/skribe/tools/skribebibtex/stklos/Makefile b/skribe/tools/skribebibtex/stklos/Makefile
new file mode 100644
index 0000000..3e31d88
--- /dev/null
+++ b/skribe/tools/skribebibtex/stklos/Makefile
@@ -0,0 +1,62 @@
+#
+# Makefile for STklos skribebibtex
+#
+# Author: Erick Gallesio [eg@essi.fr]
+# Creation date: 26-Oct-2004 18:40 (eg)
+# Last file update: 8-Nov-2004 15:25 (eg)
+
+include ../../../etc/stklos/Makefile.skb
+include ../../../etc/Makefile.config
+
+POPULATION = Makefile bibtex-lex.l bibtex-parser.y skribebibtex.stk main.stk
+BINDIR = ../../../bin
+TARGET = skribebibtex
+EXE = $(BINDIR)/$(TARGET).stklos
+
+all: $(EXE)
+
+$(EXE): main.stk bibtex-lex.stk bibtex-parser.stk
+ stklos-compile -l -o $(EXE) main.stk
+
+bibtex-lex.stk: bibtex-lex.l
+ stklos-genlex bibtex-lex.l bibtex-lex.stk bibtex-lex
+
+bibtex-parser.stk: bibtex-parser.y
+ stklos -f bibtex-parser.y
+
+bibtex: bibtex-lex.stk
+
+
+#======================================================================
+# install ...
+#======================================================================
+install: $(INSTALL_BINDIR)
+ cp $(EXE) $(INSTALL_BINDIR)/$(TARGET).stklos \
+ && chmod $(BMASK) $(INSTALL_BINDIR)/$(TARGET).stklos
+ rm -f $(INSTALL_BINDIR)/$(TARGET)
+ ln -s $(TARGET).stklos $(INSTALL_BINDIR)/$(TARGET)
+
+$(INSTALL_BINDIR):
+ mkdir -p $(INSTALL_BINDIR) && chmod a+rx $(INSTALL_BINDIR)
+
+
+#======================================================================
+# uninstall ...
+#======================================================================
+uninstall:
+ rm $(INSTALL_BINDIR)/$(TARGET)
+ rm $(INSTALL_BINDIR)/$(TARGET).stklos
+
+
+#======================================================================
+# pop ...
+#======================================================================
+pop:
+ @echo $(POPULATION:%=tools/skribebibtex/stklos/%)
+
+#======================================================================
+# clean ...
+#======================================================================
+
+clean:
+ rm -f $(EXE) bibtex-lex.stk bibtex-parser.stk *~
diff --git a/skribe/tools/skribebibtex/stklos/bibtex-lex.l b/skribe/tools/skribebibtex/stklos/bibtex-lex.l
new file mode 100644
index 0000000..03b4871
--- /dev/null
+++ b/skribe/tools/skribebibtex/stklos/bibtex-lex.l
@@ -0,0 +1,75 @@
+;;;; -*- Scheme -*-
+;;;; bibtex-lex.l -- SILex input for BibTeX
+;;;;
+;;;; Copyright © 2004 Erick Gallesio - I3S-CNRS/ESSI <eg@essi.fr>
+;;;;
+;;;;
+;;;; This program is free software; you can redistribute it and/or modify
+;;;; it under the terms of the GNU General Public License as published by
+;;;; the Free Software Foundation; either version 2 of the License, or
+;;;; (at your option) any later version.
+;;;;
+;;;; This program is distributed in the hope that it will be useful,
+;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;;; GNU General Public License for more details.
+;;;;
+;;;; You should have received a copy of the GNU General Public License
+;;;; along with this program; if not, write to the Free Software
+;;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+;;;; USA.
+;;;;
+;;;; Author: Erick Gallesio [eg@essi.fr]
+;;;; Creation date: 21-Oct-2004 17:47 (eg)
+;;;; Last file update: 25-Oct-2004 20:16 (eg)
+;;;;
+
+
+space [ \n\9]
+alpha [-+a-zA-ZàâäéèêëîïôöûüùÀÂÄÉÈÊËÎÏÔÖÛÜÙ./:()?!'&_~]
+
+%%
+
+;; Spaces
+{space}+ (list 'BLANK)
+;; Comment
+\%.*$ (yycontinue)
+;; equal sign
+= (list 'EQUAL)
+;; Open Bracket
+\{ (list 'LBRACKET)
+;; Close Bracket
+\} (list 'RBRACKET)
+;; Comma
+, (list 'COMMA)
+;; Strings
+\"[^\"]*\" (list 'STRING yytext)
+;; Commands
+@{alpha}+ (let* ((str (string-downcase
+ (substring yytext 1
+ (string-length yytext))))
+ (sym (string->symbol str)))
+ (case sym
+ ((string) (list 'BIBSTRING))
+ (else (list 'BIBITEM sym))))
+;; Ident
+{alpha}({alpha}|[0-9])* (list 'IDENT yytext)
+;; Number
+[0-9]+ (list 'NUMBER yytext)
+;; Diacritic
+\\['`^\"][aeiouAEIOU] (lex-char (string-ref yytext 1)
+ (string-ref yytext 2))
+\{\\['`^\"][aeiouAEIOU]\} (lex-char (string-ref yytext 2)
+ (string-ref yytext 3))
+
+;; Unrecognized character
+. (begin
+ (format (current-error-port)
+ "Skipping character ~S\n" yytext)
+ (yycontinue))
+
+;;;; ======================================================================
+<<EOF>> '*eoi*
+<<ERROR>> (error 'bibtex-lexer "Parse error" yytext)
+
+
diff --git a/skribe/tools/skribebibtex/stklos/bibtex-parser.y b/skribe/tools/skribebibtex/stklos/bibtex-parser.y
new file mode 100644
index 0000000..50236a9
--- /dev/null
+++ b/skribe/tools/skribebibtex/stklos/bibtex-parser.y
@@ -0,0 +1,117 @@
+;;;; -*- Scheme -*-
+;;;; bibtex-parser.y -- SILex input for BibTeX
+;;;;
+;;;; Copyright © 2004 Erick Gallesio - I3S-CNRS/ESSI <eg@essi.fr>
+;;;;
+;;;;
+;;;; This program is free software; you can redistribute it and/or modify
+;;;; it under the terms of the GNU General Public License as published by
+;;;; the Free Software Foundation; either version 2 of the License, or
+;;;; (at your option) any later version.
+;;;;
+;;;; This program is distributed in the hope that it will be useful,
+;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;;; GNU General Public License for more details.
+;;;;
+;;;; You should have received a copy of the GNU General Public License
+;;;; along with this program; if not, write to the Free Software
+;;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+;;;; USA.
+;;;;
+;;;; Author: Erick Gallesio [eg@essi.fr]
+;;;; Creation date: 21-Oct-2004 17:47 (eg)
+;;;; Last file update: 22-Oct-2004 18:14 (eg)
+;;;;
+
+(load "lalr")
+
+(define (main args)
+ ;; Build the parser
+ (lalr-parser
+ ;; Options
+ (output: parser "bibtex-parser.stk")
+
+ ;; Terminal symbols
+ (CHAR BLANK IDENT STRING COMMA LBRACKET RBRACKET NUMBER EQUAL
+ BIBSTRING BIBITEM)
+
+ ;; Rules
+ (S
+ ()
+ (S string-def)
+ (S blank*)
+ (S bibtex-entry))
+
+
+ (blank*
+ ()
+ (blank* BLANK))
+
+
+ (string-def
+ (BIBSTRING LBRACKET blank* IDENT blank* EQUAL blank* entry-value
+ blank* RBRACKET)
+ : (bibtex-string-def! (car $4) (car $8)))
+
+
+ (bibtex-entry
+ (BIBITEM LBRACKET blank* IDENT blank* COMMA blank* entry-item* RBRACKET)
+ : (make-bibentry $1 $4 $8))
+
+
+ (entry-item*
+ (blank*)
+ : '()
+ (entry-item)
+ : (list $1)
+ (entry-item COMMA entry-item*)
+ : (cons $1 $3))
+
+
+ (entry-item
+ (blank* IDENT blank* EQUAL blank* entry-value blank*)
+ : (cons (car $2) $6))
+
+
+ (entry-value
+ (NUMBER)
+ : (list (car $1))
+ (STRING)
+ : $1
+ (IDENT)
+ : (bibtex-string-ref (car $1))
+ (LBRACKET entry-value-block* RBRACKET)
+ : (list (apply string-append $2)))
+
+
+ (entry-value-block*
+ ()
+ : '()
+ (entry-value-block* entry-value-block)
+ : (append $1 $2))
+
+
+ (entry-value-block
+ (LBRACKET entry-value-block* RBRACKET)
+ : $2
+ (COMMA)
+ : (list ",")
+ (IDENT)
+ : $1
+ (BLANK)
+ : (list " ")
+ (EQUAL)
+ : (list "=")
+ (CHAR)
+ : $1
+ (NUMBER)
+ : $1
+ (STRING)
+ : $1)
+ )
+ ;; Terminate
+ 0)
+
+
+ \ No newline at end of file
diff --git a/skribe/tools/skribebibtex/stklos/main.stk b/skribe/tools/skribebibtex/stklos/main.stk
new file mode 100644
index 0000000..3225658
--- /dev/null
+++ b/skribe/tools/skribebibtex/stklos/main.stk
@@ -0,0 +1,118 @@
+;;;;
+;;;; main.stk -- Skribebibtex Main
+;;;;
+;;;; Copyright © 2004 Erick Gallesio - I3S-CNRS/ESSI <eg@essi.fr>
+;;;;
+;;;;
+;;;; This program is free software; you can redistribute it and/or modify
+;;;; it under the terms of the GNU General Public License as published by
+;;;; the Free Software Foundation; either version 2 of the License, or
+;;;; (at your option) any later version.
+;;;;
+;;;; This program is distributed in the hope that it will be useful,
+;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;;; GNU General Public License for more details.
+;;;;
+;;;; You should have received a copy of the GNU General Public License
+;;;; along with this program; if not, write to the Free Software
+;;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+;;;; USA.
+;;;;
+;;;; Author: Erick Gallesio [eg@essi.fr]
+;;;; Creation date: 22-Oct-2004 10:29 (eg)
+;;;; Last file update: 26-Oct-2004 21:52 (eg)
+;;;;
+
+(define *bibtex-strings* (make-hash-table string=?))
+(define *debug* (getenv "DEBUG"))
+(define *in* (current-input-port))
+(define *out* (current-output-port))
+
+
+(define (bibtex-string-def! str val)
+ (hash-table-put! *bibtex-strings* str val))
+
+
+(define (bibtex-string-ref str)
+ (list (hash-table-get *bibtex-strings* str str)))
+
+
+(define (lex-char accent letter)
+ (list 'CHAR
+ (case accent
+ ((#\') (case letter
+ ((#\a) "á") ((#\e) "é") ((#\i) "í") ((#\o) "ó") ((#\u) "ú")
+ ((#\A) "Á") ((#\E) "É") ((#\I) "Í") ((#\O) "Ó") ((#\U) "ú")
+ (else "?")))
+ ((#\`) (case letter
+ ((#\a) "à") ((#\e) "è") ((#\i) "ì") ((#\o) "ò") ((#\u) "ù")
+ ((#\A) "À") ((#\E) "È") ((#\I) "Ì") ((#\O) "Ò") ((#\U) "Ù")
+ (else "?")))
+ ((#\^) (case letter
+ ((#\a) "â") ((#\e) "ê") ((#\i) "î") ((#\o) "ô") ((#\u) "û")
+ ((#\A) "Â") ((#\E) "Ê") ((#\I) "Î") ((#\O) "Ô") ((#\U) "Û")
+ (else "?")))
+ ((#\") (case letter
+ ((#\a) "ä") ((#\e) "ë") ((#\i) "ï") ((#\o) "ö") ((#\u) "ü")
+ ((#\A) "Ä") ((#\E) "Ë") ((#\I) "Ï") ((#\O) "Ö") ((#\U) "Ü")
+ (else "?")))
+ (else "?"))))
+
+
+(define (make-bibentry kind key infos)
+ (define (pretty-string s)
+ (if (and (string? s)
+ (>= (string-length s) 2)
+ (eq? #\" (string-ref s 0))
+ (eq? #\" (string-ref s (- (string-length s) 1))))
+ (substring s 1 (- (string-length s) 1))
+ s))
+ (format *out* ";;;;\n(~A ~S\n" (car kind) (car key))
+ (for-each (lambda (x) (format *out* " (~A ~S)\n"
+ (car x)
+ (pretty-string (cadr x))))
+ infos)
+ (format *out* ")\n\n"))
+
+
+;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+(include "bibtex-lex.stk")
+(include "bibtex-parser.stk")
+;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+(define (bibtex2scheme in out)
+ (let* ((lex (bibtex-lex in))
+ (scan (lambda ()
+ (let ((tok (lexer-next-token lex)))
+ (when *debug*
+ (format (current-error-port) "token = ~S\n" tok))
+ tok)))
+ (error (lambda (a b) (error 'bibtex-parser "~A~A" a b))))
+ (parser scan error)))
+
+
+(define (main args)
+ ;; Parse the program arguments
+ (parse-arguments args
+ "Usage: skribebibtex [options] [input]"
+ (("help" :alternate "h" :help "provide help for the command")
+ (arg-usage (current-error-port))
+ (exit 0))
+ (("options" :help "display the options and exit")
+ (arg-usage (current-output-port) #t)
+ (exit 0))
+ (("output" :alternate "o" :arg file :help "set the output to <file>")
+ (let ((port (open-file file "w")))
+ (if port
+ (set! *out* port)
+ (die (format "~A: bad output file ~S" 'skribebibtex file) 1))))
+ (else
+ (cond
+ ((= (length other-arguments) 1)
+ (let* ((file (car other-arguments))
+ (port (open-file file "r")))
+ (if port
+ (set! *in* file)
+ (die (format "~A: bad input file ~S" 'skribebibtex file) 1)))))))
+ (bibtex2scheme *in* *out*))