2014-05-24 37 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