2014-02-28 51 views
0

我想獲得有限的域名工作的語法。語法在http://tools.ietf.org/html/rfc1035的2.3.1節定義。它的一個子集是根據python parsley - 域名的語法

<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ] 
<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str> 
<let-dig-hyp> ::= <let-dig> | "-" 
<let-dig> ::= <letter> | <digit> 
<letter> ::= any one of the 52 alphabetic characters A through Z in upper case and a through z in lower case 
<digit> ::= any one of the ten digits 0 through 9 

我下面的嘗試。我想匹配label

from parsley import makeGrammar 
import ometa 
domain = makeGrammar(''' 
letdighyp = (letterOrDigit|-) 
label = letterOrDigit letdighyp+ letterOrDigit 
''', {}) 

tests = ('abcd1000',) 
for t in tests: 
    try: 
     print domain(t).label() 
    except ometa.runtime.ParseError as e: 
     print 'parse failed for', t 
     print e 

運行,讓我

parse failed for abcd1000 

abcd1000 
^ 
Parse error at line 2, column 0: expected EOF. trail: [digit letdig letdighyp] 

我在做什麼錯?

P.S.

label = letterOrDigit letdighyp+ letterOrDigit 

是我無法工作的線路。如果最後一個letterOrDigit不在那裏,它匹配字符串。

回答

0

嘗試:

from parsley import makeGrammar 
import ometa 
def check_the_rest(s): 
    if '-' in s: 
     return s[-1].isalnum() 
    return True 

domain = makeGrammar(''' 
letdighyp = (letterOrDigit|'-') 
# label = <letterOrDigit (letdighyp* letterOrDigit)*> 
label = <letter the_rest> 
the_rest = letdighyp*:r ?(check_the_rest(r)) -> r 
''', dict(check_the_rest=check_the_rest)) 

tests = ('a', 'abcd1000', 'a-',) 
for t in tests: 
    try: 
     print('✓', domain(t).label()) 
    except ometa.runtime.ParseError as e: 
     print('parse failed for', t) 
     print(e) 

(最後一次測試應該失敗)

我使用PY 3支由vsajip

+0

這是行不通的。該語法指定標籤必須以letterOrDigit開頭和結尾。連字符只允許排除這些位置。 – kkrs

+0

我給了一個去,並認爲我知道了。看到我更新的答案。 –

+0

該語法還解析了什麼應該是一個錯誤,說'a-'。 'python domain.py abcd1000 a-' – kkrs