我正在学习lex
,我有一些疑问。
我在一个文件中有一些正则表达式,我有这三个(这是为了匹配Java注释):
"//".*"\n" {LINE+=1; COLUMN=1;}
\/\/.* {LINE+=1; COLUMN=1;}
\n {LINE+=1; COLUMN=1;}
我相信第二个正则表达式与"//".*
相同。
我理解第一个匹配评论以//
开头,后跟零个或多个字符,然后是新行。第二个做同样的事情但没有换行。
我怀疑是这样的。第二个和第三个正则表达式的组合与第一个正则表达式完全相同吗?
我将这个提交到一个测试平台,没有第一个表达式,它说我有一个错误,并且我说的第一个表达式是正确的,但我似乎找不到没有第一个正则表达式的例子评论不匹配。
答案 0 :(得分:1)
第二个和第三个正则表达式的组合肯定与第一个正则表达式匹配相同的字符串,但它们不会以相同的方式对这些字符串起作用。如果省略第一条规则和行动,那么请输入
// Some comment
将导致{LINE+=1; COLUMN=1;}
被执行两次,因此LINE
将增加2.如果您的测试工具关注LINE
和COLUMN
的正确性,那么这不会被认为是正确的。
肯定是第一种模式是不必要的。你可以改用:
"//".* { COLUMN += yyleng; }
\n { LINE += 1; COLUMN = 1; }
有一种情况"//".*\n
不匹配评论:如果评论是输入的最后一行而输入未以换行符终止。从技术上讲,有效的文本(源)文件必须以换行符终止,因为换行实际上是行终止符,而不是行分隔符或行启动符,因为它的通用名称可能暗示。但是,大多数编译器都允许未终止的输入行。
无论如何,输入可能包含空白和未注释的行,因此您需要识别\n
是否是评论的一部分,只要您自己跟踪行号和列位置