2016-05-12 45 views
-1

我已經做了簡單的查詢簡單的解析器,從數據存儲中獲取數據。我用的操作數<,< =,>,> =,==,!= 解析器工作正常,每一個操作數,除了< 我與行爲,因爲每個操作數的正則表達式都有點驚訝幾乎相同。我無法找到我可能做錯了什麼。由Parsley Python RegEx解析錯誤

代碼:

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值時,我用我在那裏使用值令牌搜索WS,並改變了價值

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

這解決了我的問題。