some progress with the wiki2beamer grammar
authorKai Dietrich <mail@cleeus.de>
Mon, 10 Jan 2011 21:27:54 +0000 (22:27 +0100)
committerKai Dietrich <mail@cleeus.de>
Mon, 10 Jan 2011 21:27:54 +0000 (22:27 +0100)
yappstest/Makefile [new file with mode: 0644]
yappstest/test.sh [deleted file]
yappstest/test.txt
yappstest/test_complex.txt [deleted file]
yappstest/w2b.g
yappstest/w2b.py [deleted file]
yappstest/w2b_test.py

diff --git a/yappstest/Makefile b/yappstest/Makefile
new file mode 100644 (file)
index 0000000..7e32ac8
--- /dev/null
@@ -0,0 +1,10 @@
+.PHONY: test clean
+
+test:  w2b.py
+       python w2b_test.py test.txt 
+
+w2b.py: Makefile w2b.g
+       yapps2 w2b.g w2b.py
+
+clean:
+       rm w2b.py
diff --git a/yappstest/test.sh b/yappstest/test.sh
deleted file mode 100755 (executable)
index 5c5d9e5..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-
-rm w2b.py w2b.pyc
-
-yapps2 w2b.g w2b.py
-
-python w2b_test.py document test_complex.txt
index 67884dc2c2821380866cf06a450ead7dcdf4d016..a2d1107a3da1ddd006e66504ec4adfd99be7c5ec 100644 (file)
@@ -1,5 +1,7 @@
 
 
---2em--
+*<1,3> listitem1
+*#<1-2> subitem2 *#<1->
+
 
 
diff --git a/yappstest/test_complex.txt b/yappstest/test_complex.txt
deleted file mode 100644 (file)
index 70314b0..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-* listitem1
-*# subitem2
-
index 123fad78a8049aa2ef9bdbe14e5849d46d720d62..5674758f2bc6c8a17580ee1f2b5a1d7c4ac472b3 100644 (file)
@@ -4,10 +4,11 @@ parser wiki2beamer:
        token END:              "$"
        token SPACE:            "[ \\t]+"
        token NEWLINE:          "\\r?\\n"
-       token PARBREAK:         "(\\r?\\n|^)((\\r?\\n)+)"
+       token PARBREAK:         "(\\r?\\n)(\\r?\\n)+"
        token NUM:              "[0-9]+"
        token WORD:             "[a-zA-Z]+"
-       token PUNCTUATION:      "(,|\\.|\\?|:|;|\"|'|`|´|\\\\[|\\\\]|\\\\<|\\\\>)+"
+       token PUNCT:            "(,|\\.|\\?|:|;|\"|'|`|´|\\[|\\])+"
+       token PUNCT_SPECIAL:    "[*#<>\\-]+"
        token MINUS:            "-"
        token COMMA:            ","
        token LATEX_COMMAND_NAME: "\\\\([a-zA-Z]+)"
@@ -25,8 +26,7 @@ parser wiki2beamer:
        token W2B_H4_R:         "===="
        token W2B_ENDFRAME:     "\\[frame\\]>"
        token OVERLAY_SPEC_SIMPLE: "[0-9-, \\t]+"
-       token W2B_UL:           "\\*"
-       token W2B_OL:           "#"
+       token W2B_LISTBLOCK_BEGIN: "\\r?\\n?[\\*#]+"
        token W2B_ESC_EXCLM:    "\\\\!"
        token W2B_ALERT_L:      "!"
        token W2B_ALERT_R:      "!"
@@ -102,66 +102,50 @@ parser wiki2beamer:
                (
                        w2b_single_line {{result.append(w2b_single_line)}}
                        [NEWLINE {{result.append(('NEWLINE', NEWLINE))}}]
-               )
-               (
-                       w2b_single_line {{result.append(w2b_single_line)}}
-                       [NEWLINE {{result.append(('NEWLINE', NEWLINE))}}]
-               )*
+               )+
                {{return ('W2B_TEXTBLOCK', result)}}
 
        rule w2b_listblock:
                {{ result = [] }}
-               (W2B_UL {{result.append(('W2B_UL', W2B_UL))}} | W2B_OL {{result.append(('W2B_OL', W2B_OL))}})
                (
-                       (W2B_UL {{result.append(('W2B_UL', W2B_UL))}} | W2B_OL {{result.append(('W2B_OL', W2B_OL))}})*
-                       [overlay_spec {{result.append(overlay_spec)}}]
-                       SPACE   {{result.append(('SPACE', SPACE))}}
-                       w2b_single_line {{result.append(w2b_single_line)}}
-                       [
-                               NEWLINE {{result.append(('NEWLINE', NEWLINE))}}
-                               (W2B_UL {{result.append(('W2B_UL', W2B_UL))}}
-                       |       W2B_OL {{result.append(('W2B_OL', W2B_OL))}})
-                       ]
-               )*
+                       W2B_LISTBLOCK_BEGIN {{ result.append(('W2B_LISTBLOCK_BEGIN', W2B_LISTBLOCK_BEGIN)) }}
+                       [ overlay_spec {{ result.append(overlay_spec) }} ]
+                       [ SPACE {{ result.append(('SPACE', SPACE)) }} ]
+                       [ w2b_single_line {{ result.append( w2b_single_line ) }} ]
+               )+
                {{ return ('W2B_LIST_BLOCK', result) }}
-
+       
        rule w2b_single_line:
                {{ result = [] }}
+               
                (
-                       WORD                    {{result.append(('WORD', WORD))}}
-               |       NUM                     {{result.append(('NUM', NUM))}}
-               |       SPACE                   {{result.append(('SPACE', SPACE))}}
-               |       w2b_escape_seq          {{result.append(w2b_escape_seq)}}
-               |       w2b_text_alert          {{result.append(w2b_text_alert)}}
-               |       w2b_text_bold           {{result.append(w2b_text_bold)}}
-               |       w2b_text_italic         {{result.append(w2b_text_italic)}}
-               |       w2b_text_texttt         {{result.append(w2b_text_texttt)}}
-               |       w2b_text_textcolor      {{result.append(w2b_text_textcolor)}}
-               |       w2b_vspace              {{result.append(w2b_vspace)}}
-               |       w2b_vspacestar          {{result.append(w2b_vspacestar)}}
-               |       w2b_env_open            {{result.append(w2b_env_open)}}
-               |       w2b_env_close           {{result.append(w2b_env_close)}}
-               |       w2b_nowiki              {{result.append(w2b_nowiki)}}
-               |       PUNCTUATION             {{result.append(('PUNCTUATION', PUNCTUATION))}}
-               )
+                       w2b_single_line_simple {{ result.append(w2b_single_line_simple) }}
+                       [ PUNCT_SPECIAL {{ result.append(('PUNCT_SPECIAL', PUNCT_SPECIAL)) }} ]
+               )+
+
+               {{return ('W2B_SINGLE_LINE', result)}}
+       
+       rule w2b_single_line_simple:
+               {{ result = [] }}
                (
-                       WORD                    {{result.append(('WORD', WORD))}}
-               |       NUM                     {{result.append(('NUM', NUM))}}
-               |       SPACE                   {{result.append(('SPACE', SPACE))}}
-               |       w2b_escape_seq          {{result.append(w2b_escape_seq)}}
-               |       w2b_text_alert          {{result.append(w2b_text_alert)}}
-               |       w2b_text_bold           {{result.append(w2b_text_bold)}}
-               |       w2b_text_italic         {{result.append(w2b_text_italic)}}
-               |       w2b_text_texttt         {{result.append(w2b_text_texttt)}}
-               |       w2b_text_textcolor      {{result.append(w2b_text_textcolor)}}
-               |       w2b_vspace              {{result.append(w2b_vspace)}}
-               |       w2b_vspacestar          {{result.append(w2b_vspacestar)}}
-               |       w2b_env_open            {{result.append(w2b_env_open)}}
-               |       w2b_env_close           {{result.append(w2b_env_close)}}
-               |       w2b_nowiki              {{result.append(w2b_nowiki)}}
-               |       PUNCTUATION             {{result.append(('PUNCTUATION', PUNCTUATION))}}
-               )*
+                       WORD                    {{ result.append(('WORD', WORD)) }}
+               |       NUM                     {{ result.append(('NUM', NUM)) }}
+               |       SPACE                   {{ result.append(('SPACE', SPACE)) }}
+               |       w2b_escape_seq          {{ result.append(w2b_escape_seq) }}
+               |       w2b_text_alert          {{ result.append(w2b_text_alert) }}
+               |       w2b_text_bold           {{ result.append(w2b_text_bold) }}
+               |       w2b_text_italic         {{ result.append(w2b_text_italic) }}
+               |       w2b_text_texttt         {{ result.append(w2b_text_texttt) }}
+               |       w2b_text_textcolor      {{ result.append(w2b_text_textcolor) }}
+               |       w2b_vspace              {{ result.append(w2b_vspace) }}
+               |       w2b_vspacestar          {{ result.append(w2b_vspacestar) }}
+               |       w2b_env_open            {{ result.append(w2b_env_open) }}
+               |       w2b_env_close           {{ result.append(w2b_env_close) }}
+               |       w2b_nowiki              {{ result.append(w2b_nowiki) }}
+               |       PUNCT                   {{ result.append(('PUNCT', PUNCT)) }}
+               )+
                {{return ('W2B_SINGLE_LINE', result)}}
+       
 
        #TODO hack environment open/close matching outside of the grammar (graph-transformation?)
        rule w2b_env_open:
diff --git a/yappstest/w2b.py b/yappstest/w2b.py
deleted file mode 100644 (file)
index cd3f80e..0000000
+++ /dev/null
@@ -1,382 +0,0 @@
-# Begin -- grammar generated by Yapps
-import sys, re
-import yapps.yappsrt as yappsrt
-
-class wiki2beamerScanner(yappsrt.Scanner):
-    patterns = [
-        ('END', re.compile('$')),
-        ('SPACE', re.compile('[ \\t]+')),
-        ('NEWLINE', re.compile('\\r?\\n')),
-        ('PARBREAK', re.compile('(\\r?\\n|^)((\\r?\\n)+)')),
-        ('NUM', re.compile('[0-9]+')),
-        ('WORD', re.compile('[a-zA-Z]+')),
-        ('PUNCTUATION', re.compile('(,|\\.|\\?|:|;|"|\'|`|\xc2\xb4|\\\\[|\\\\]|\\\\<|\\\\>)+')),
-        ('MINUS', re.compile('-')),
-        ('COMMA', re.compile(',')),
-        ('LATEX_COMMAND_NAME', re.compile('\\\\([a-zA-Z]+)')),
-        ('BRACKET_CURLY_L', re.compile('{')),
-        ('BRACKET_CURLY_R', re.compile('}')),
-        ('BRACKET_ANGLE_L', re.compile('<')),
-        ('BRACKET_ANGLE_R', re.compile('>')),
-        ('BRACKET_SQUARE_L', re.compile('\\[')),
-        ('BRACKET_SQUARE_R', re.compile('\\]')),
-        ('W2B_H2_L', re.compile('==')),
-        ('W2B_H2_R', re.compile('==')),
-        ('W2B_H3_L', re.compile('===')),
-        ('W2B_H3_R', re.compile('===')),
-        ('W2B_H4_L', re.compile('====')),
-        ('W2B_H4_R', re.compile('====')),
-        ('W2B_ENDFRAME', re.compile('\\[frame\\]>')),
-        ('OVERLAY_SPEC_SIMPLE', re.compile('[0-9-, \\t]+')),
-        ('W2B_UL', re.compile('\\*')),
-        ('W2B_OL', re.compile('#')),
-        ('W2B_ESC_EXCLM', re.compile('\\\\!')),
-        ('W2B_ALERT_L', re.compile('!')),
-        ('W2B_ALERT_R', re.compile('!')),
-        ('W2B_ALERT_IN', re.compile('[^!\\r\\n]*')),
-        ('W2B_BOLD_L', re.compile("'''")),
-        ('W2B_BOLD_R', re.compile("'''")),
-        ('W2B_BOLD_IN', re.compile("[^'\\r\\n]*")),
-        ('W2B_ITALIC_L', re.compile("''")),
-        ('W2B_ITALIC_R', re.compile("''")),
-        ('W2B_ITALIC_IN', re.compile("[^'\\r\\n]*")),
-        ('W2B_ESC_AT', re.compile('\\\\@')),
-        ('W2B_TEXTTT_L', re.compile('@')),
-        ('W2B_TEXTTT_R', re.compile('@')),
-        ('W2B_TEXTTT_IN', re.compile('[^@\\r\\n]*')),
-        ('W2B_TEXTCOLOR_L', re.compile('_')),
-        ('W2B_TEXTCOLOR_COLOR', re.compile('[^_\\r\\n]*')),
-        ('W2B_TEXTCOLOR_MID', re.compile('_')),
-        ('W2B_TEXTCOLOR_IN', re.compile('[^_\\r\\n]*')),
-        ('W2B_TEXTCOLOR_R', re.compile('_')),
-        ('W2B_VSPACE_L', re.compile('--')),
-        ('W2B_VSPACE_R', re.compile('--')),
-        ('W2B_VSPACE_IN', re.compile('[^-\\r\\n]*')),
-        ('W2B_VSPACESTAR_L', re.compile('--\\*')),
-        ('W2B_ENV_NAME', re.compile('[a-zA-Z]+')),
-        ('W2B_ENV_OPEN_L', re.compile('<\\[')),
-        ('W2B_ENV_OPEN_R', re.compile('\\]')),
-        ('W2B_ENV_CLOSE_L', re.compile('\\[')),
-        ('W2B_ENV_CLOSE_R', re.compile('\\]>')),
-        ('W2B_AUTOTEMPLATE_OPEN', re.compile('<\\[[ \\t]*autotemplate[ \\t]*\\]')),
-        ('W2B_AUTOTEMPLATE_CLOSE', re.compile('\\[[ \\t]*autotemplate[ \\t]*\\]>')),
-        ('W2B_AUTOTEMPLATE_IN', re.compile('[\\n\\r\\sa-zA-Z]*')),
-        ('W2B_NOWIKI_OPEN', re.compile('<\\[[ \\t]*nowiki[ \\t]*\\]')),
-        ('W2B_NOWIKI_CLOSE', re.compile('\\[[ \\t]*nowiki[ \\t]*\\]>')),
-        ('W2B_NOWIKI_IN', re.compile('(\\\\<|\\\\>|\\\\\\[|\\\\\\]|[^\\[\\]<>])*')),
-    ]
-    def __init__(self, str):
-        yappsrt.Scanner.__init__(self,None,[],str)
-
-class wiki2beamer(yappsrt.Parser):
-    Context = yappsrt.Context
-    def document(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'document', [])
-        result = []
-        while self._peek('END', 'PARBREAK', 'W2B_UL', 'W2B_OL', 'WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L') != 'END':
-            _token = self._peek('PARBREAK', 'W2B_UL', 'W2B_OL', 'WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L')
-            if _token == 'PARBREAK':
-                PARBREAK = self._scan('PARBREAK')
-                result.append(('PARBREAK', PARBREAK))
-            else:
-                paragraph = self.paragraph(_context)
-                result.append(paragraph)
-        if self._peek() not in ['END', 'PARBREAK', 'W2B_UL', 'W2B_OL', 'WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L']:
-            raise yappsrt.SyntaxError(charpos=self._scanner.get_prev_char_pos(), context=_context, msg='Need one of ' + ', '.join(['PARBREAK', 'END', 'W2B_UL', 'W2B_OL', 'WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L']))
-        END = self._scan('END')
-        result.append(('END',))
-        return result
-
-    def paragraph(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'paragraph', [])
-        result = None
-        _token = self._peek('W2B_UL', 'W2B_OL', 'WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L')
-        if _token not in ['W2B_UL', 'W2B_OL']:
-            w2b_textblock = self.w2b_textblock(_context)
-            result = w2b_textblock
-        else: # in ['W2B_UL', 'W2B_OL']
-            w2b_listblock = self.w2b_listblock(_context)
-            result = w2b_listblock
-        return ('PARAGRAPH', result)
-
-    def w2b_nowiki(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_nowiki', [])
-        W2B_NOWIKI_OPEN = self._scan('W2B_NOWIKI_OPEN')
-        W2B_NOWIKI_IN = self._scan('W2B_NOWIKI_IN')
-        W2B_NOWIKI_CLOSE = self._scan('W2B_NOWIKI_CLOSE')
-        return ('W2B_NOWIKI', W2B_NOWIKI_IN)
-
-    def w2b_autotemplate(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_autotemplate', [])
-        W2B_AUTOTEMPLATE_OPEN = self._scan('W2B_AUTOTEMPLATE_OPEN')
-        W2B_AUTOTEMPLATE_IN = self._scan('W2B_AUTOTEMPLATE_IN')
-        W2B_AUTOTEMPLATE_CLOSE = self._scan('W2B_AUTOTEMPLATE_CLOSE')
-        return ('AUTOTEMPLATE', W2B_AUTOTEMPLATE_IN)
-
-    def w2b_textblock(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_textblock', [])
-        result = []
-        w2b_single_line = self.w2b_single_line(_context)
-        result.append(w2b_single_line)
-        if self._peek('NEWLINE', 'WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L', 'PARBREAK', 'END', 'W2B_UL', 'W2B_OL') == 'NEWLINE':
-            NEWLINE = self._scan('NEWLINE')
-            result.append(('NEWLINE', NEWLINE))
-        while self._peek('WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L', 'PARBREAK', 'END', 'W2B_UL', 'W2B_OL') not in ['PARBREAK', 'END', 'W2B_UL', 'W2B_OL']:
-            w2b_single_line = self.w2b_single_line(_context)
-            result.append(w2b_single_line)
-            if self._peek('NEWLINE', 'WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L', 'PARBREAK', 'END', 'W2B_UL', 'W2B_OL') == 'NEWLINE':
-                NEWLINE = self._scan('NEWLINE')
-                result.append(('NEWLINE', NEWLINE))
-        if self._peek() not in ['WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L', 'PARBREAK', 'END', 'W2B_UL', 'W2B_OL']:
-            raise yappsrt.SyntaxError(charpos=self._scanner.get_prev_char_pos(), context=_context, msg='Need one of ' + ', '.join(['WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L', 'PARBREAK', 'END', 'W2B_UL', 'W2B_OL']))
-        return ('W2B_TEXTBLOCK', result)
-
-    def w2b_listblock(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_listblock', [])
-        result = []
-        _token = self._peek('W2B_UL', 'W2B_OL')
-        if _token == 'W2B_UL':
-            W2B_UL = self._scan('W2B_UL')
-            result.append(('W2B_UL', W2B_UL))
-        else: # == 'W2B_OL'
-            W2B_OL = self._scan('W2B_OL')
-            result.append(('W2B_OL', W2B_OL))
-        while self._peek('W2B_UL', 'W2B_OL', 'SPACE', 'BRACKET_ANGLE_L', 'PARBREAK', 'END', 'WORD', 'NUM', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L') in ['W2B_UL', 'W2B_OL', 'SPACE', 'BRACKET_ANGLE_L']:
-            while self._peek('W2B_UL', 'W2B_OL', 'SPACE', 'BRACKET_ANGLE_L') in ['W2B_UL', 'W2B_OL']:
-                _token = self._peek('W2B_UL', 'W2B_OL')
-                if _token == 'W2B_UL':
-                    W2B_UL = self._scan('W2B_UL')
-                    result.append(('W2B_UL', W2B_UL))
-                else: # == 'W2B_OL'
-                    W2B_OL = self._scan('W2B_OL')
-                    result.append(('W2B_OL', W2B_OL))
-            if self._peek() not in ['W2B_UL', 'W2B_OL', 'SPACE', 'BRACKET_ANGLE_L']:
-                raise yappsrt.SyntaxError(charpos=self._scanner.get_prev_char_pos(), context=_context, msg='Need one of ' + ', '.join(['W2B_UL', 'W2B_OL', 'SPACE', 'BRACKET_ANGLE_L']))
-            if self._peek('SPACE', 'BRACKET_ANGLE_L') == 'BRACKET_ANGLE_L':
-                overlay_spec = self.overlay_spec(_context)
-                result.append(overlay_spec)
-            SPACE = self._scan('SPACE')
-            result.append(('SPACE', SPACE))
-            w2b_single_line = self.w2b_single_line(_context)
-            result.append(w2b_single_line)
-            if self._peek('NEWLINE', 'W2B_UL', 'W2B_OL', 'SPACE', 'BRACKET_ANGLE_L', 'PARBREAK', 'END', 'WORD', 'NUM', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L') == 'NEWLINE':
-                NEWLINE = self._scan('NEWLINE')
-                result.append(('NEWLINE', NEWLINE))
-                _token = self._peek('W2B_UL', 'W2B_OL')
-                if _token == 'W2B_UL':
-                    W2B_UL = self._scan('W2B_UL')
-                    result.append(('W2B_UL', W2B_UL))
-                else: # == 'W2B_OL'
-                    W2B_OL = self._scan('W2B_OL')
-                    result.append(('W2B_OL', W2B_OL))
-        if self._peek() not in ['W2B_UL', 'W2B_OL', 'SPACE', 'BRACKET_ANGLE_L', 'PARBREAK', 'END', 'WORD', 'NUM', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L']:
-            raise yappsrt.SyntaxError(charpos=self._scanner.get_prev_char_pos(), context=_context, msg='Need one of ' + ', '.join(['W2B_UL', 'W2B_OL', 'SPACE', 'BRACKET_ANGLE_L', 'PARBREAK', 'END', 'WORD', 'NUM', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L']))
-        return ('W2B_LIST_BLOCK', result)
-
-    def w2b_single_line(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_single_line', [])
-        result = []
-        _token = self._peek('WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L')
-        if _token == 'WORD':
-            WORD = self._scan('WORD')
-            result.append(('WORD', WORD))
-        elif _token == 'NUM':
-            NUM = self._scan('NUM')
-            result.append(('NUM', NUM))
-        elif _token == 'SPACE':
-            SPACE = self._scan('SPACE')
-            result.append(('SPACE', SPACE))
-        elif _token in ['W2B_ESC_AT', 'W2B_ESC_EXCLM']:
-            w2b_escape_seq = self.w2b_escape_seq(_context)
-            result.append(w2b_escape_seq)
-        elif _token == 'W2B_ALERT_L':
-            w2b_text_alert = self.w2b_text_alert(_context)
-            result.append(w2b_text_alert)
-        elif _token == 'W2B_BOLD_L':
-            w2b_text_bold = self.w2b_text_bold(_context)
-            result.append(w2b_text_bold)
-        elif _token == 'W2B_ITALIC_L':
-            w2b_text_italic = self.w2b_text_italic(_context)
-            result.append(w2b_text_italic)
-        elif _token == 'W2B_TEXTTT_L':
-            w2b_text_texttt = self.w2b_text_texttt(_context)
-            result.append(w2b_text_texttt)
-        elif _token == 'W2B_TEXTCOLOR_L':
-            w2b_text_textcolor = self.w2b_text_textcolor(_context)
-            result.append(w2b_text_textcolor)
-        elif _token == 'W2B_VSPACE_L':
-            w2b_vspace = self.w2b_vspace(_context)
-            result.append(w2b_vspace)
-        elif _token == 'W2B_VSPACESTAR_L':
-            w2b_vspacestar = self.w2b_vspacestar(_context)
-            result.append(w2b_vspacestar)
-        elif _token == 'W2B_ENV_OPEN_L':
-            w2b_env_open = self.w2b_env_open(_context)
-            result.append(w2b_env_open)
-        elif _token == 'W2B_ENV_CLOSE_L':
-            w2b_env_close = self.w2b_env_close(_context)
-            result.append(w2b_env_close)
-        elif _token == 'W2B_NOWIKI_OPEN':
-            w2b_nowiki = self.w2b_nowiki(_context)
-            result.append(w2b_nowiki)
-        else: # == 'PUNCTUATION'
-            PUNCTUATION = self._scan('PUNCTUATION')
-            result.append(('PUNCTUATION', PUNCTUATION))
-        while self._peek('WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L', 'NEWLINE', 'W2B_UL', 'W2B_OL', 'BRACKET_ANGLE_L', 'PARBREAK', 'END') not in ['NEWLINE', 'W2B_UL', 'W2B_OL', 'BRACKET_ANGLE_L', 'PARBREAK', 'END']:
-            _token = self._peek('WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L')
-            if _token == 'WORD':
-                WORD = self._scan('WORD')
-                result.append(('WORD', WORD))
-            elif _token == 'NUM':
-                NUM = self._scan('NUM')
-                result.append(('NUM', NUM))
-            elif _token == 'SPACE':
-                SPACE = self._scan('SPACE')
-                result.append(('SPACE', SPACE))
-            elif _token in ['W2B_ESC_AT', 'W2B_ESC_EXCLM']:
-                w2b_escape_seq = self.w2b_escape_seq(_context)
-                result.append(w2b_escape_seq)
-            elif _token == 'W2B_ALERT_L':
-                w2b_text_alert = self.w2b_text_alert(_context)
-                result.append(w2b_text_alert)
-            elif _token == 'W2B_BOLD_L':
-                w2b_text_bold = self.w2b_text_bold(_context)
-                result.append(w2b_text_bold)
-            elif _token == 'W2B_ITALIC_L':
-                w2b_text_italic = self.w2b_text_italic(_context)
-                result.append(w2b_text_italic)
-            elif _token == 'W2B_TEXTTT_L':
-                w2b_text_texttt = self.w2b_text_texttt(_context)
-                result.append(w2b_text_texttt)
-            elif _token == 'W2B_TEXTCOLOR_L':
-                w2b_text_textcolor = self.w2b_text_textcolor(_context)
-                result.append(w2b_text_textcolor)
-            elif _token == 'W2B_VSPACE_L':
-                w2b_vspace = self.w2b_vspace(_context)
-                result.append(w2b_vspace)
-            elif _token == 'W2B_VSPACESTAR_L':
-                w2b_vspacestar = self.w2b_vspacestar(_context)
-                result.append(w2b_vspacestar)
-            elif _token == 'W2B_ENV_OPEN_L':
-                w2b_env_open = self.w2b_env_open(_context)
-                result.append(w2b_env_open)
-            elif _token == 'W2B_ENV_CLOSE_L':
-                w2b_env_close = self.w2b_env_close(_context)
-                result.append(w2b_env_close)
-            elif _token == 'W2B_NOWIKI_OPEN':
-                w2b_nowiki = self.w2b_nowiki(_context)
-                result.append(w2b_nowiki)
-            else: # == 'PUNCTUATION'
-                PUNCTUATION = self._scan('PUNCTUATION')
-                result.append(('PUNCTUATION', PUNCTUATION))
-        if self._peek() not in ['WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L', 'NEWLINE', 'W2B_UL', 'W2B_OL', 'BRACKET_ANGLE_L', 'PARBREAK', 'END']:
-            raise yappsrt.SyntaxError(charpos=self._scanner.get_prev_char_pos(), context=_context, msg='Need one of ' + ', '.join(['WORD', 'NUM', 'SPACE', 'W2B_NOWIKI_OPEN', 'PUNCTUATION', 'W2B_ESC_AT', 'W2B_ESC_EXCLM', 'W2B_ALERT_L', 'W2B_BOLD_L', 'W2B_ITALIC_L', 'W2B_TEXTTT_L', 'W2B_TEXTCOLOR_L', 'W2B_VSPACE_L', 'W2B_VSPACESTAR_L', 'W2B_ENV_OPEN_L', 'W2B_ENV_CLOSE_L', 'NEWLINE', 'W2B_UL', 'W2B_OL', 'BRACKET_ANGLE_L', 'PARBREAK', 'END']))
-        return ('W2B_SINGLE_LINE', result)
-
-    def w2b_env_open(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_env_open', [])
-        W2B_ENV_OPEN_L = self._scan('W2B_ENV_OPEN_L')
-        if self._peek('SPACE', 'W2B_ENV_NAME') == 'SPACE':
-            SPACE = self._scan('SPACE')
-        W2B_ENV_NAME = self._scan('W2B_ENV_NAME')
-        if self._peek('SPACE', 'W2B_ENV_OPEN_R') == 'SPACE':
-            SPACE = self._scan('SPACE')
-        W2B_ENV_OPEN_R = self._scan('W2B_ENV_OPEN_R')
-        return ('W2B_ENV_OPEN', W2B_ENV_NAME)
-
-    def w2b_env_close(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_env_close', [])
-        W2B_ENV_CLOSE_L = self._scan('W2B_ENV_CLOSE_L')
-        if self._peek('SPACE', 'W2B_ENV_NAME') == 'SPACE':
-            SPACE = self._scan('SPACE')
-        W2B_ENV_NAME = self._scan('W2B_ENV_NAME')
-        if self._peek('SPACE', 'W2B_ENV_CLOSE_R') == 'SPACE':
-            SPACE = self._scan('SPACE')
-        W2B_ENV_CLOSE_R = self._scan('W2B_ENV_CLOSE_R')
-        return ('W2B_ENV_CLOSE', W2B_ENV_NAME)
-
-    def w2b_escape_seq(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_escape_seq', [])
-        result = None
-        _token = self._peek('W2B_ESC_AT', 'W2B_ESC_EXCLM')
-        if _token == 'W2B_ESC_AT':
-            W2B_ESC_AT = self._scan('W2B_ESC_AT')
-            result = ('W2B_ESC_AT', W2B_ESC_AT)
-        else: # == 'W2B_ESC_EXCLM'
-            W2B_ESC_EXCLM = self._scan('W2B_ESC_EXCLM')
-            result = ('W2B_ESC_EXCLM', W2B_ESC_EXCLM)
-        return result
-
-    def w2b_text_alert(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_text_alert', [])
-        W2B_ALERT_L = self._scan('W2B_ALERT_L')
-        W2B_ALERT_IN = self._scan('W2B_ALERT_IN')
-        W2B_ALERT_R = self._scan('W2B_ALERT_R')
-        return ('W2B_ALERT', W2B_ALERT_IN)
-
-    def w2b_text_bold(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_text_bold', [])
-        W2B_BOLD_L = self._scan('W2B_BOLD_L')
-        W2B_BOLD_IN = self._scan('W2B_BOLD_IN')
-        W2B_BOLD_R = self._scan('W2B_BOLD_R')
-        return ('W2B_BOLD', W2B_BOLD_IN)
-
-    def w2b_text_italic(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_text_italic', [])
-        W2B_ITALIC_L = self._scan('W2B_ITALIC_L')
-        W2B_ITALIC_IN = self._scan('W2B_ITALIC_IN')
-        W2B_ITALIC_R = self._scan('W2B_ITALIC_R')
-        return ('W2B_ITALIC', W2B_ITALIC_IN)
-
-    def w2b_text_texttt(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_text_texttt', [])
-        W2B_TEXTTT_L = self._scan('W2B_TEXTTT_L')
-        W2B_TEXTTT_IN = self._scan('W2B_TEXTTT_IN')
-        W2B_TEXTTT_R = self._scan('W2B_TEXTTT_R')
-        return ('W2B_TEXTTT', W2B_TEXTTT_IN)
-
-    def w2b_text_textcolor(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_text_textcolor', [])
-        W2B_TEXTCOLOR_L = self._scan('W2B_TEXTCOLOR_L')
-        W2B_TEXTCOLOR_COLOR = self._scan('W2B_TEXTCOLOR_COLOR')
-        W2B_TEXTCOLOR_MID = self._scan('W2B_TEXTCOLOR_MID')
-        W2B_TEXTCOLOR_IN = self._scan('W2B_TEXTCOLOR_IN')
-        W2B_TEXTCOLOR_R = self._scan('W2B_TEXTCOLOR_R')
-        return ('W2B_TEXTCOLOR', W2B_TEXTCOLOR_COLOR, W2B_TEXTCOLOR_IN)
-
-    def w2b_vspace(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_vspace', [])
-        W2B_VSPACE_L = self._scan('W2B_VSPACE_L')
-        W2B_VSPACE_IN = self._scan('W2B_VSPACE_IN')
-        W2B_VSPACE_R = self._scan('W2B_VSPACE_R')
-        return ('W2B_VSPACE', W2B_VSPACE_IN)
-
-    def w2b_vspacestar(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'w2b_vspacestar', [])
-        W2B_VSPACESTAR_L = self._scan('W2B_VSPACESTAR_L')
-        W2B_VSPACE_IN = self._scan('W2B_VSPACE_IN')
-        W2B_VSPACE_R = self._scan('W2B_VSPACE_R')
-        return ('W2B_VSPACESTAR', W2B_VSPACE_IN)
-
-    def overlay_spec(self, _parent=None):
-        _context = self.Context(_parent, self._scanner, self._pos, 'overlay_spec', [])
-        BRACKET_ANGLE_L = self._scan('BRACKET_ANGLE_L')
-        OVERLAY_SPEC_SIMPLE = self._scan('OVERLAY_SPEC_SIMPLE')
-        BRACKET_ANGLE_R = self._scan('BRACKET_ANGLE_R')
-        return ('OVERLAY_SPEC', OVERLAY_SPEC_SIMPLE)
-
-
-def parse(rule, text):
-    P = wiki2beamer(wiki2beamerScanner(text))
-    return yappsrt.wrap_error_reporter(P, rule)
-
-if __name__ == '__main__':
-    from sys import argv, stdin
-    if len(argv) >= 2:
-        if len(argv) >= 3:
-            f = open(argv[2],'r')
-        else:
-            f = stdin
-        print parse(argv[1], f.read())
-    else: print >>sys.stderr, 'Args:  <rule> [<filename>]'
-# End -- grammar generated by Yapps
index d3c7468acddbbccecc1a15d366f6f42f75f442e9..91a1602de7d7508bfa8d3cb285cfeb9c03ed0359 100644 (file)
@@ -1,6 +1,9 @@
 #!/usr/bin/env python
 
 import w2b
+from yapps import yappsrt
+import traceback
+import sys
 
 def ast_print_escape(string):
     string = string.replace('\n', '\\n')
@@ -8,7 +11,7 @@ def ast_print_escape(string):
     string = string.replace('\t', '\\t')
     return string
 
-def ast_print(ast_node, level):
+def ast_print(ast_node, level=0):
     space_prefix = level * ' '
     if type(ast_node) == list:
         print '\n%s[' % space_prefix ,
@@ -36,11 +39,31 @@ def ast_print(ast_node, level):
 
 if __name__ == '__main__':
     from sys import argv, stdin
-    if len(argv) >= 2:
-        if len(argv) >= 3:
-            f = open(argv[2],'r')
+    if len(argv) >= 1:
+        if len(argv) >= 2:
+            f = open(argv[1],'r')
         else:
             f = stdin
-        ast_print(w2b.parse(argv[1], f.read()), 0)
-    else: print >>sys.stderr, 'Args:  <rule> [<filename>]'
+        
+        text = f.read()
+        scanner = w2b.wiki2beamerScanner(text)
+        parser = w2b.wiki2beamer(scanner)
+        ast = None
+        try:
+            ast = parser.document()
+        except yappsrt.SyntaxError, e:
+            traceback.print_exc()
+            print >>sys.stderr, ""
+            input = scanner.input
+            yappsrt.print_error(input, e, scanner)
+        except yappsrt.NoMoreTokens:
+            traceback.print_exc()
+            print >>sys.stderr, ""
+            print >>sys.stderr, "Could not complete parsing; stopped around here:"
+            print >>sys.stderr, scanner
+        
+        if ast != None:
+            ast_print(ast)
+        
+    else: print >>sys.stderr, 'Args: [<filename>]'