1

ラテックス構文の小さな拡張をしたいと思います。
この解析作業を回避するための純粋なラテックスの方法があり、私はそれらを知っています。
この質問の目標は、次の解析問題を解決することです。

If \ep is small                    --> If \epsilon is small  

\theorem                           --> \begin{theorem}  
(tab) lorem ipsum                  --> (tab) lorem ipsum  
(tab) lorem ipsum                  --> (tab) lorem ipsum  
(no tab) Some text                 --> \end{theorem}  
                                       Some text 

A function \oldFunction{x}{y}      --> A function \newFunction{x}{y}

Some other text with latex construct like \frac{1}{2} (not part of the grammar)

などのキーワードがいくつかあるので、新しいキーワードに変換したいと考えていますep。 それらは入れ子にすることができます。 oldFunction

\oldFunction{\ep}{\ep}

theoremのように、コンテンツを囲む「タブ」一貫性のあるキーワードがあります。
このタブで構成されるキーワークはネストできます。

\theorem  
(tab) \lemma  
(tab) (tab) \oldFunction{\ep}{\ep}  

また、前の行のように、キーワード\ep\theoremキーワードを混在させることもできます。

次に、他のすべてのラテックス構造がありますが、私は触れずにそのままにしておきます。

pyParsing とcodeTalkerを調べます。
codeTalker は文脈自由文法です。記述文法が文脈自由であるかどうかはわかりません。
pyParsing はそれを行うことができます。ドキュメントを調べますが、適用方法がわかりません。
解析の問題に遭遇したのはこれが初めてです。

4

1 に答える 1

1

解析ライブラリをまったく使用しなくても済むようです。私は考えています:

newstuff = {r'\b\ep\b':r'\epsilon',r'\b\other\b':r'\notherthings'}
fixed = []
intheorem = False
for line in source:
    for k,v in newstuff:
        line = re.sub(k, v, line)
    if not line.startswith('\t') and intheorem:
        fixed.append('\end{theorem}')
        intheorem = False
    if line.startswith('\theorem')
        line = '\begin{theorem}'
        intheorem = True
    fixed.append(line)
if intheorem:
    fixed.append('\end{theorem}')

それは理にかなっていますか?各行で、すべての特別な名前を正規表現で置換し、特別な「\theorem」ブロックのインデントを追跡します。

于 2013-03-31T16:35:07.483 に答える