【问题标题】:Lex what does this regular expressionLex 这个正则表达式是做什么的
【发布时间】:2014-07-13 15:41:24
【问题描述】:

我正在学习lex,我有一些疑问。

我在一个文件中有一些正则表达式,我有这三个(这是为了匹配 Java cmets):

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

我相信第二个正则表达式和"//".*是一样的。

我知道第一个匹配 cmets 以 // 开头,后跟零个或多个字符,然后是新行。第二个做同样的事情,但没有新行。

我的怀疑是这个。第二个和第三个正则表达式的组合不是和第一个完全一样吗?

我将其提交到测试平台,如果没有第一个表达式,它表示我有一个错误,而第一个表达式我说这是正确的,但我似乎找不到没有第一个正则表达式的示例评论不匹配。

【问题讨论】:

    标签: regex lex flex-lexer


    【解决方案1】:

    第二个和第三个正则表达式的组合肯定与第一个正则表达式匹配相同的字符串,但它们对这些字符串的作用方式不同。如果您遗漏了第一个规则和操作,则对输入进行词法分析

    // Some comment
    

    将导致{LINE+=1; COLUMN=1;} 被执行两次,因此LINE 将增加2。如果您的测试工具关心LINECOLUMN 的正确性,那么这将不会被视为正确.

    当然,第一个模式是不必要的。您可以改为使用:

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

    有一种情况"//".*\n 不会匹配注释:如果注释是输入的最后一行并且输入没有以换行符终止。从技术上讲,有效的文本(源)文件必须由换行符终止,因为换行符实际上是行终止符,而不是行分隔符或行起始符,正如其通用名称所暗示的那样。但是,大多数编译器将允许未终止的输入行。

    无论如何,输入可能包含空白和未注释的行,因此您需要识别 \n 是否是注释的一部分,只要您自己跟踪行号和列位置。

    【讨论】:

    • 非常感谢您的解释...您说得对。提出您的更改建议,它通过了我的所有测试
    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 2020-06-16
    • 2012-02-13
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多