2014-05-24 146 views
1

我在學習lex,我有一些疑問。Lex這是什麼正則表達式

我有一些正則表達式在一個文件中,並將它們我有這三(這是相匹配的Java註釋):

"//".*"\n" {LINE+=1; COLUMN=1;} 
\/\/.*  {LINE+=1; COLUMN=1;} 
\n   {LINE+=1; COLUMN=1;} 

我認爲,第二個正規表達式是一樣的"//".*

據我所知,第一個匹配的評論以//開頭,然後是零個或多個字符,然後換行。第二種做同樣的事情,但沒有新的路線。

我的疑問是這樣的。第二個和第三個正則表達式的組合是否與第一個正則表達式完全相同?

我將這個提交到測試平臺,並沒有第一個表達式,它說我有一個錯誤,並與第一個表達式,我說這是正確的,但我似乎無法找到一個示例,沒有第一個常規表達評論不匹配。

回答

1

第二個和第三個正則表達式的組合肯定與第一個正則表達式匹配相同的字符串,但它們不會以相同的方式對這些字符串起作用。如果你離開了第一條規則和動作,然後樂星被執行了兩次輸入

// Some comment 

將導致{LINE+=1; COLUMN=1;},使LINE將由2遞增如果你的測試工具關心的LINECOLUMN正確性那麼這將不被認爲是正確的。

確實如此,第一種模式是不必要的。你也可以使用:

"//".*  { COLUMN += yyleng;  } 
\n   { LINE += 1; COLUMN = 1; } 

有在"//".*\n不會匹配註釋一種情況:如果註釋是輸入的最後一行,並輸入不以換行符終止。從技術上講,有效的文本(源)文件必須以換行符結尾,因爲換行符實際上是行終止符,而不是行分隔符或行起始符,因爲它的通用名可能意味着此行。但是,大多數編譯器將允許未終止的輸入行。

無論如何,輸入可能有空白和未註釋的行,因此只要您自己跟蹤行號和列位置,您就需要識別\n它是否爲註釋的一部分。

+0

非常感謝您的解釋......您是對的。提出您的更改建議,並通過我所有的測試 – Favolas