2011-07-06 64 views
3

我終於回到充實,我要添加到YI一個GitCommit消息模式匹配單個字符,但我似乎失去了一些東西基本。我似乎無法匹配語法中的單個字符,所有我的規則只在匹配整行時才起作用。我知道這一定是可能的,因爲YI中的其他語法顯然是這樣做的,但做同樣的事情似乎並不奏效。不能在亞歷語法

我想有一個提交模式,並最終看起來非常相似,一個在vim。在vim模式下有用的一個方面是關鍵字高亮內容。 Git在其所做的大部分事情(commit,rebase等等)中都提供了大量信息,所以這很有用。我的想法與git註釋中的首字母'#'匹配,並切換到與關鍵字匹配的不同上下文。不過,我似乎無法做出符合只是以「#」的規則,該規則切換到發表評論說只有包含「#」行,但在包含「#」後面的所有行的風格確實不切換樣式。

我有現在的問題是:

<0> { 
\#        { m (const $ LineComment) Style.commentStyle } 
$commitChars*$     { c Style.defaultStyle } 
} 

<lineComment> {                          
$nl       { m (const Digest) Style.defaultStyle }            
·        { c Style.regexStyle }                 
}  

詳細顯然省略。我們的想法是,當我們看到一個'#'並且以不同的方式進行樣式設置時,切換到'lineComment'模式,直到我們看到行結束。根據文檔和示例,應該有辦法做我想做的事情。我已經嘗試了幾乎所有可以考慮的'#'模式的排列,但沒有任何更改我看到的行爲。
我錯過了什麼明顯的東西?

編輯: 上面的代碼是從我的彝族支系內實施。我有一個獨立的解析器,出現同樣的問題here。如果您運行alex GitCommit.x && ghc --make GitCommit.hs && ./GitCommit < shortmsg,您將看到註釋行的內容被解析爲MessageLine,並且空註釋行正確標記爲CommentStart

回答

1

好吧,我終於想通了這一點。它看起來像亞歷克斯總是採取最長的比賽,而不是第一場比賽。匹配提交行的規則將始終比較長,因爲它匹配整行。這導致Alex始終在評論分支上選擇該分支。從亞歷克斯文檔

When the input stream matches more than one rule, the rule which matches the longest prefix of the input stream wins. If there are still several rules which match an equal number of characters, then the rule which appears earliest in the file wins.

引用我想我應該閱讀文檔不止一次。解決方法是從$commitChars字符集中刪除'#'。

+1

這是被稱爲[最大適合](http://en.wikipedia.org/wiki/Maximal_munch)規則。 – hammar

+0

感謝您的鏈接,這給了我更多關於爲什麼這樣工作的背景。 – asm