基于pyparsing的tex文件处理
目 录
 1 绪论 1
 1.1 研究意义 1
 1.2 研究现状 1
 1.2.1 python发展现状 1
 1.2.2 Tex文件处理的现状 1
 1.3 研究内容 2
 1.3.1 研究的重点和难点 2
 1.3.2 拟解决的关键问题 2
 1.3.3 研究的方法及措施 3
 1.3.4 成果 3
 2 理论基础 4
 2.1 Python特点与基本语法 4
 2.1.1代码块与缩进 5
 2.1.2控制语句 6
 2.1.3数据类型和运算 7
 2.1.4函数 7
 2.1.5其他 7
 2.2 形式文法基本原理 8
 2.3 数学类tex文件基本内容 9
 2.4 数学公式文法 10
 3 pyparsing 程序实现 12
 3.1 pyparsing解析器设计原理 12
 3.2 实验 13
 结 论 14
 参考文献 15
 附 录 16
 致 谢 27
 1.3 研究内容
 本文要要解决的主要问题是:Tex文件广泛应用于pdf论文写作,尤其是理学类的论文,因此tex文件包含了大量的原始信息,并具有确定的语法。我们要做的便是利用pyparsing通过语法分析,设计出针对tex文件的解析语法,提取tex文件的主要内容。
 1.3.1 研究的重点和难点
 1.学习Python编程,掌握pyparsing语法.
 2.学习tex语法,主要是编辑数学公式的语法和某些重要的命令。
 1.3.2 拟解决的关键问题
 1.对语法解析和pyparsing的功能作一个简要描述。
 2.学习Python编程,学习正则表达式,掌握pyparsing语法。
 3.了解latex语法,主要是编辑数学公式的语法和某些重要的命令。
 4.用pyparsing解析tex文件,读取重要内容。
 1.3.3 研究的方法及措施
 论文运用经验与逻辑结合的分析方法。逻辑是指tex文件固定的文法;经验主要对tex文件个例的分析,总结作者的编写习惯,提出一些化繁为简的方案。全面解析tex文件有些困难,主要是解析数学表达式。最后得出结论。
 1.3.4成果
 在对Tex文件的命令语法和数学表达式语法进行深入研究后,设计出针对tex数学表达式的上下文无关文法,然后用pyparsing实现上下文无关文法的解析方法,也就是文法解析器,在用解析器解析并提取tex文件的数学公式结构等内容。这对学术研究有很大的潜在价值。
# -*- coding: utf-8 -*-
from pyparsing import *
from pyparsing_ext import *
digit = Word(nums)
ESC = Suppress('\\')
OPEN = Suppress('{')
CLOSE = Suppress('}')
SUB = Suppress('_')
SUP = Suppress('^')
DOT = Suppress('.')
def totree(x):
    return x if isinstance(x, str) else x.totree()
Action = BaseAction 
class ActionIntExp(Action):
    def __init__(self, tokens):
        super(ActionIntExp, self).__init__(tokens)
        self.op = 'int'
        self.function = tokens.function
        self.variable = tokens.variable
        self.lower_bound = tokens.lower_bound.content
        self.upper_bound = tokens.upper_bound.content
    def totree(self):
        return [self.op, self.function.totree(), totree(self.variable), totree(self.lower_bound), totree(self.upper_bound)]
    def __repr__(self):
        return '%s(%s, %s, %s, %s)'%(self.op, self.function, self.variable, self.lower_bound,self.upper_bound)
class ActionSumExp(Action):
    def __init__(self, tokens):
        super(ActionSumExp, self).__init__(tokens)
        self.op = 'sum'
        self.item = tokens.item
        
        if isinstance(tokens.lower_bound.content, ActionMathEq):
            self.lower_bound = tokens.lower_bound.content.rhs
            self.index = tokens.lower_bound.content.lhs
        else:
            self.index = tokens.lower_bound.content
            self.lower_bound = '0'
        if 'upper_bound' in tokens:
            self.upper_bound = tokens.upper_bound.content
        else:
            self.upper_bound = 'infty'
    def totree(self):
        return [self.op, self.item.totree(), totree(self.index), totree(self.lower_bound), totree(self.upper_bound)]
    def __repr__(self):
        return '%s(%s, %s, %s, %s)'%(self.op, self.item, self.index, self.lower_bound, self.upper_bound)

 
 
 
 
 
 
 
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!