Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据前面的结果选择解析器_Python_Haskell_Pyparsing_Parsec - Fatal编程技术网

Python 根据前面的结果选择解析器

Python 根据前面的结果选择解析器,python,haskell,pyparsing,parsec,Python,Haskell,Pyparsing,Parsec,我正在分析几个输出,这些文件有两个不同的头: header1 = " MO EIGENVALUES, MO OCCUPATION NUMBERS, AND CARTESIAN MO EIGENVECTORS AFTER SCF STEP -1" header2 = "MO EIGENVALUES, MO OCCUPATION NUMBERS, AND SPHERICAL MO EIGENVECTORS AFTER SCF STEP -1" 基于结果是笛卡尔坐标系或球坐标系的语句,我想应用相

我正在分析几个输出,这些文件有两个不同的头:

header1 = " MO EIGENVALUES, MO OCCUPATION NUMBERS, AND CARTESIAN MO EIGENVECTORS AFTER SCF STEP -1"

header2 =  "MO EIGENVALUES, MO OCCUPATION NUMBERS, AND SPHERICAL MO EIGENVECTORS AFTER SCF STEP -1"
基于结果是笛卡尔坐标系或球坐标系的语句,我想应用相应的解析器

在Haskell中,我可以编写一个解析器,根据前面的结果决定下一步要做什么,如下所示:

myparser = do
    xs <- someParser
    if xs == "foo"
       then parser1
       else parser2
myparser=do

xs这里是一个应该有效的解决方案的概要。其思想是实现一个新的解析器类,该类运行一个解析器,并根据返回的令牌在两个备选方案之间进行选择

# modeled after class And in pyparsing.py
class IfThenElse(ParseExpression):

  def __init__(self, exprs, savelist = True):
    super(IfThenElse,self).__init__(exprs, savelist)
    self.parserIf = exprs[1]     # maybe exprs[0]?
    self.parserThen = exprs[2]
    self.parserElse = exprs[3]
    self.mayReturnEmpty = all(e.mayReturnEmpty for e in exprs[2:])
    self.setWhitespaceChars( ... )
    self.skipWhitespace = self.exprs[0].skipWhitespace

  def parseImpl(self, instring, loc, doActions = True):
    loc, toks = self.parserIf._parse(instring, loc, doActions)

    if ...toks...:
      loc, toks2 = self.parserThen._parse(instring, loc, doActions)
    else:
      loc, toks2 = self.parserElse._parse(instring, loc, doActions)

    return loc, toks2   # maybe combine toks and toks2?

def __str__(self):
  return "blah"         # for now
if…toks…
是您放置切换逻辑的地方

您还需要实现一个
\uuuu str\uuu
方法,可能还需要实现一个
checkRecursion
方法

有一些细节需要弄清楚。。。也许
exprs[0]
是“if”解析器,而不是
exprs[1]


IfThenElse(p,q,r)
实例化这个解析器——应该与
解析器具有相同的语法。

我认为在pyparsing中,一个人只需写:

oneParserToRuleThemAll = header1 + parser1 | header2 + parser2
如果标题行与'header1'匹配,则pyparsing将继续进行,并使用parser1进行其余的解析。否则,它将尝试匹配“header2”,如果匹配,将使用parser2

使用动态解析器元素和解析操作肯定可以获得更多的异国情调。看起来是这样的:

foo_parser = ...
bar_parser = ...

variable_parser = Forward()
switch_parser = Literal("foo") | Literal("bar")
def select_variable_parser(tokens):
    if tokens[0] == "foo":
        variable_parser <<= foo_parser
    if tokens[0] == "bar":
        varaible_parser <<= bar_parser
switch_parser.setParseAction(select_variable_parser)
parser = switch_parser + variable_parser

有趣的扩展,有点像三元运算符类。
parser = "foo" + foo_parser | "bar" + bar_parser