解析一个简单的乳胶扩展:语法,递归下降,pyParsing?

时间:2013-03-31 13:22:07

标签: python parsing grammar pyparsing recursive-descent

我想做一个乳胶语法的小扩展。
有纯乳胶的方法来避免这种解析练习,我知道它们 这个问题的目标是解决以下解析问题。

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)

所以我有一些关键字,例如epoldFunction,我想转换为新的关键字。
它们可以嵌套。

\oldFunction{\ep}{\ep}

我有一个'标签'一致的关键字,例如theorem,其中包含内容 此选项卡包含keyworks可以嵌套。

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

此外,\ep\theorem关键字可以混合使用,就像上一行一样。

然后,还有其他所有的乳胶构造,我不接触,只是离开那里。

我研究了pyParsing和codeTalker codeTalker是无上下文语法,我不知道我的描述语法是否是无上下文的 pyParsing可以做到,我查看文档,但我不明白如何应用它 这是我第一次遇到解析问题。

1 个答案:

答案 0 :(得分: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}')

这有意义吗?在每一行中,对所有特殊名称进行正则表达式替换,并跟踪特殊" \定理"的缩进。块。