基于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进行投诉反馈,一经查实,立即删除!