2013-12-10 73 views
1

我有問題一樣here (nested function calls)pyparsing - 定義關鍵字 - 比較文字,詞,關鍵詞,並結合

我想也限制了仿函數是唯一的許多給出的單詞(A,B,C)

一個

所以法律是:

a(dd, ee) 
b(a(1)) 

但不是:

aa(b(9)) - aa is invalid functor here 

我能做到這一點使用一個:

functor1 = Literal('a') | Literal('b') | Literal('c') 
functor2 = Word('a') | Word('b') | Word('c') 
functor3 = Keyword('a') | Keyword('b') | Keyword('c') 
functor4 = Combine(Keyword('a') | Keyword('b') | Keyword('c')) 

首先是容易的,但其餘的是太曖昧了,我(尤其是Word有PARAM asKeyword,但它的代碼不使用關鍵字類,反之亦然)。

請比較一下。

是OR列表工作作爲Combine?

回答

1

這裏是一些用於比較你的pyparsing表達式的測試代碼。

from pyparsing import * 

functor1 = Literal('a') | Literal('b') | Literal('c') 
functor2 = Word('a') | Word('b') | Word('c') 
functor3 = Keyword('a') | Keyword('b') | Keyword('c') 
functor4 = Combine(Keyword('a') | Keyword('b') | Keyword('c')) 

functor1.setName("Literal('a') | Literal('b') | Literal('c')") 
functor2.setName("Word('a') | Word('b') | Word('c')") 
functor3.setName("Keyword('a') | Keyword('b') | Keyword('c')") 
functor4.setName("Combine(Keyword('a') | Keyword('b') | Keyword('c'))") 
functors = [functor1, functor2, functor3, functor4] 

tests = "a b c aaa bbb ccc after before".split() 
for func in functors: 
    print func 
    for t in tests: 
     try: 
      print t, ':', func.parseString(t) 
     except ParseException as pe: 
      print pe 
    print 

打印:

Literal('a') | Literal('b') | Literal('c') 
a : ['a'] 
b : ['b'] 
c : ['c'] 
aaa : ['a'] 
bbb : ['b'] 
ccc : ['c'] 
after : ['a'] 
before : ['b'] 

Word('a') | Word('b') | Word('c') 
a : ['a'] 
b : ['b'] 
c : ['c'] 
aaa : ['aaa'] 
bbb : ['bbb'] 
ccc : ['ccc'] 
after : ['a'] 
before : ['b'] 

Keyword('a') | Keyword('b') | Keyword('c') 
a : ['a'] 
b : ['b'] 
c : ['c'] 
aaa : Expected "a" (at char 0), (line:1, col:1) 
bbb : Expected "a" (at char 0), (line:1, col:1) 
ccc : Expected "a" (at char 0), (line:1, col:1) 
after : Expected "a" (at char 0), (line:1, col:1) 
before : Expected "a" (at char 0), (line:1, col:1) 

Combine(Keyword('a') | Keyword('b') | Keyword('c')) 
a : ['a'] 
b : ['b'] 
c : ['c'] 
aaa : Expected "a" (at char 0), (line:1, col:1) 
bbb : Expected "a" (at char 0), (line:1, col:1) 
ccc : Expected "a" (at char 0), (line:1, col:1) 
after : Expected "a" (at char 0), (line:1, col:1) 
before : Expected "a" (at char 0), (line:1, col:1) 

你應該能夠使這些意見:

  • Literal將在給定的字符串匹配,即使它是 較大僅僅是開始串。

  • Word將匹配由其構造函數字符串中的字母組成的字符組字符 。

  • Keyword將 只有當它是不是一個更大的字 的一部分給定的字符串匹配(其次是空間,或由非單詞字符)

  • Combine沒有 做任何事情在這例。

Combine的目的是將多個匹配的標記合併到一個字符串中。舉例來說,如果你定義一個社會安全號碼爲:

Word(nums,exact=3) + '-' + Word(nums,exact=2) + '-' + Word(nums,exact=4) 

然後解析「555-66-7777」會給你

['555', '-', '66', '-', '7777'] 

最有可能你想這是一個字符串,所以通過將分析器表達式打包到Combine

Combine(Word(nums,exact=3) + '-' + Word(nums,exact=2) + '-' + Word(nums,exact=4)) 

['555-66-7777']