2010-03-09 49 views
0

我有一個簡單的語法設置像這樣:樹頂語法問題

 
grammar Test 
    rule line 
     (adjective/not_adjective)* { 
     def content 
      elements.map{|e| e.content } 
     end 
     } 
    end 
    rule adjective 
     ("good"/"bad"/"excellent") { 
      def content 
       [:adjective, text_value] 
      end 
     } 
    end 
    rule not_adjective 
     !adjective { 
      def content 
       [:not_adjective, text_value] 
      end 
     } 
    end 
end 

比方說,我的輸入爲「這是一個很好的球,讓我們使用它。」這給出了一個錯誤,我現在沒有提及,因爲我想理解爲什麼錯誤的理論。 那麼,我該如何創建規則not_adjective,以便它匹配任何與規則形容詞不匹配的東西?一般來說,如何編寫我的規則(特別是在Treetop中)「不符合另一個命名規則?

回答

1

Treetop是一個parser generator,它從一個特殊的文法類別Parsing Expression Grammars or PEG中生成解析器。
!expression的操作解釋是,如果expression失敗,則成功;如果expression成功,則失敗,但消耗無輸入
要匹配任何規則expression不匹配與否定操作,以避免某些「字」一起使用運營商(即匹配任何內容):

(!expression .)* ie. "match anything BUT expression" 
1

以前的答案是不正確的OP的問題,因爲它會匹配任何單個字符序列直到任何形容詞。所以,如果你看到字符串xyzgood,它會匹配xyz,並且下面的規則將匹配「good」部分作爲形容詞。同樣,OP的形容詞規則將「徽章」的前三個字符與形容詞「bad」相匹配,這不是他們想要的。

相反,形容詞規則應該是這個樣子:

rule adjective 
    a:("good"/"bad"/"excellent") ![a-z] { 
    def content 
     [:adjective, a.text_value] 
    end 
    } 
end 

和not_adjective規則是這樣的:

rule not_adjective 
    !adjective w:([a-z]+) { 
    def content 
     [:not_adjective, w.text_value] 
    end 
    } 
end 

包括處理爲大寫字母,連字符,撇號,等等,如必要。當然,您還需要空白處理。