2016-05-12 6 views
-1

データストアからデータを取得する簡単なクエリ用の単純なパーサを作成しました。私が使用しているオペランドが<は=、>、> =、==、!= ザ・パーサが< を除くすべてのオペランドのために正常に動作し、各オペランドの正規表現があるので、私は行動と少し驚いて、<ありますほぼ同じです。私は間違ったことを見つけることができません。RegEx Parse Error by Parsley Python

コード:他のすべてのオペランドの

import parsley 

from FieldSet import FieldSet 
from Field import Field 

class QueryParser(object): 

    def __init__(self,getter): 
     self.__defineParser() 
     self.getter = getter 


    def __defineParser(self): 
     self.parseField = parsley.makeGrammar(""" 
     neq = <letterOrDigit*>:field ws '!=' ws <letterOrDigit*>:value ->Field(field,value,'!=') 
     eq = <letterOrDigit*>:field ws '==' ws <letterOrDigit*>:value ->Field(field,value,'==') 

     lte = <letterOrDigit*>:field ws '<=' ws <digit*'.'?digit*>:value ->Field(field,value,'<=') 
     gte = <letterOrDigit*>:field ws '>=' ws <digit*'.'?digit*>:value ->Field(field,value,'>=') 

     lt = <letterOrDigit*>:field ws '<' ws <digit*'.'?digit*>:value ->Field(field,value,'<') 
     gt = <letterOrDigit*>:field ws '>' ws <digit*'.'?digit*>:value ->Field(field,value,'>') 

     fieldCondition = ws (neq | eq | lte | lt | gte |gt):evalTuple ws -> evalTuple 

     """,{'Field':Field}) 

     self.parse = parsley.makeGrammar(""" 

     neq = <letterOrDigit* ws '!=' ws letterOrDigit*>:s ->str(s) 
     eq = <letterOrDigit* ws '==' ws letterOrDigit*>:s ->str(s) 

     lte = <letterOrDigit* ws '<=' ws digit*'.'?digit*>:s->str(s) 
     gte = <letterOrDigit* ws '>=' ws digit*'.'?digit*>:s ->str(s) 

     lt = <letterOrDigit* ws '<' ws digit*'.'?digit*>:s->str(s) 
     gt = <letterOrDigit* ws '>' ws digit*'.'?digit*>:s ->str(s) 


     parens = ws '(' ws expr:e ws ')' ws -> e 
     value = ws parens | neq | eq | lte | lt | gte |gt ws 
     ws = ' '* 

     and = 'AND' ws expr3:n -> ('AND', n) 
     or = 'OR' ws expr3:n -> ('OR', n) 

     not = 'NOT' ws value:n -> ('NOT', n) 

     checknot = ws (value|not) 

     andor = ws (and | or) 

     expr = expr3:left andor*:right -> performOperations(left, right) 
     expr3 = ws checknot:right -> getVal(right) 

     """, {"performOperations": self.performOperations,'getVal':self.getVal}) 

    def processQuery(self,field): 
     if type(field) is FieldSet: 
      return field 
     elif type(field) is Field: 
      elements = FieldSet(field,self.getter) 
      return elements 
     else: 
      raise Exception("Invalid Input") 


    def performOperations(self,start, pairs): 

     result = start 

     if type(result) is Field: 
      result = self.processQuery(start) 


     for op, value in pairs: 
      if op == 'AND': 
       secondField = self.processQuery(value) 
       result.union(secondField) 
      elif op == 'OR': 
       secondField = self.processQuery(value) 
       result.intersection(secondField) 
       print type(result) 
     print result.getSet() 
     return result 

    '''This functions will be returning sets''' 

    def getVal(self,field): 

     if type(field) is tuple: 
      _op,value = field 
      result = self.parseField(value).fieldCondition() 
      result.negate() 
     elif type(field) is FieldSet: 
      result = field 
     else: 
      result = self.parseField(field).fieldCondition() 
     print "res",result 
     return result  


    def getResults(self,query): 
     return self.parse(query).expr().getSet() 
if __name__=="__main__": 
    pae = QueryParser("POP") 
    print pae.getResults("lame>10") 

出力はこの

res lame<10 
set(['-&-lame<10']) 
set(['-&-lame<10']) 

しかし、 '>' 出力/エラーがようであるためのようなものです:

Traceback (most recent call last): 
    File "D:\Nother\engine\parser\QueryParser.py", line 107, in <module> 
    print pae.getResults("lame>10") 
    File "D:\Nother\engine\parser\QueryParser.py", line 104, in getResults 
    return self.parse(query).expr().getSet() 
    File "D:\Nother\lookup_env\lib\site-packages\parsley.py", line 98, in invokeRule 
    raise err 
ometa.runtime.EOFError: 
lame>10 
^ 
Parse error at line 2, column 0: end of input. trail: [digit] 

私はいくつかの数字を見つけるしようとしていると仮定します。しかし、同様の正規表現他のオペランドのために書かれており、エラーにはならず、これは奇妙であるようです。 誰かがこれを調べて、私が間違っている場所を教えてくれればと感謝します。

答えて

0

このregExの問題は、regExの値をどのように処理したかです。ここで

value = ws parens | neq | eq | lte | lt | gte |gt ws 

私は、このように代わりに空白が、それは強制されたオプションであることの、すべての可能なオプションの前後に空白を追加しています。 はそうではなく値で、ここでWSを使用するよりも、私はこれは私の問題を解決し

value = parens | neq | eq | lte | lt | gte |gt 

に私は検索用の値のトークンを使用していたWS、および変更された値を使用していました。