Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法识别Lex中的单行注释_C_Lex_Compiler Construction - Fatal编程技术网

C 无法识别Lex中的单行注释

C 无法识别Lex中的单行注释,c,lex,compiler-construction,C,Lex,Compiler Construction,在这个过程中,我正在学习lex,我正在为C语言生成标记,并试图识别单行注释“/”,但与除法运算符有冲突 [1-9][0-9]*|0x[0-9a-fA-F][0-9a-fA-F]* return NUMBER; [a-zA-Z][a-zA-Z0-9]* return IDENT; / {return DIVIDE;} [ \t\r\

在这个过程中,我正在学习lex,我正在为C语言生成标记,并试图识别单行注释“/”,但与除法运算符有冲突

[1-9][0-9]*|0x[0-9a-fA-F][0-9a-fA-F]*           return NUMBER;
[a-zA-Z][a-zA-Z0-9]*                            return IDENT;
/                                               {return DIVIDE;}

[ \t\r\n]
[//]
但当我运行示例并输入//时,它会将它们识别为2个除法运算符。我应该在哪里修改代码。任何建议

编辑:

法律代码:

%{
#include "y.tab.h"
%}
%array
%%
if                                              {return IF;}
while                                           {return WHILE;}
else                                            {return ELSE;}
int                                             {return INT;}
return                                          {return RETURN;}
\/\/[^\r\n]*
[1-9][0-9]*|0x[0-9a-fA-F][0-9a-fA-F]*           return NUMBER;
[a-zA-Z][a-zA-Z0-9]*                            return IDENT;

[+]                                             {return ADD;}
[-]                                             {return SUB;}
[<]                                             {return LESS;}
[>]                                             {return GREAT;}
[*]                                             {return MULT;}
[/]                                             {return DIVIDE;}
[;]                                             {return SEMICOLON;}

\{                                              return LBRACE;
\}                                              return RBRACE;

[ \t\r\n]

\(                                              return LPAREN;

\)                                              return RPAREN;

.                                               return BADCHAR;
%%
以下是正在运行的输入

//
/
p
Token 16, text /
Token 16, text /
Token 16, text /
Token 5, text p
当我运行它时,注释被使用,甚至除法操作符也被忽略。但是,当我输入p时,它会对上面列出的运算符进行分类,这是不应该做的

Note: Am trying to ignore tabs, newline characters and single line comments. 

Note 2: \/\/[^\r\n]* I have understood where I committed the mistake and wanted to share this.

根据莱克斯手册:

编写了词法分析程序 与莱克斯接受模棱两可 规格和选择最长的 在每个输入点都可能匹配。如果 必要的、实质性的前瞻是必要的 在输入上执行,但输入 流将备份到 当前分区,以便 用户有操作的一般自由 它

因此,您不需要做任何特殊的操作-
/
/
长,因此当它看到两个运算符时,它更喜欢注释而不是除法运算符。然而,你没有发布你的评论规则-它在哪里

编辑:没关系,我看到了<代码>[/]是一个字符类。拆下方括号。此外,您将希望匹配到行的末尾,否则您将只允许空注释。所以你的正则表达式应该是:

/[^\r\n]*\r\n
(根据需要调整所支持的换行符-此操作要求换行符完全是
\r\n

编辑2:@tur1ng提出了一个很好的观点-文件中的最后一行可能不会以换行结束。我查了一下,Lex在其正则表达式中也支持
(请参阅)。因此,您可以更改为:


/[^\r\n]*((\r\n)|)

我试图忽略制表符、换行符和单行注释您是对的。匹配的阴影不是问题,我已删除了我的答案。如果最后一行包含类似“//…”的内容,会发生什么情况?“//[^\r\n]*\r\n”会失败,并且“//[^\r\n]*”是正确的方法?首先,在运行示例时,//s Token 16,text/Token 16,text/Token 5,文本s我第一次输入注释时,它被使用,但下一次输入s时,它会识别两次除法,然后识别s。此外,请在问题中以正确的格式发布测试用例,以便我可以准确地看到您的输入内容和结果。回答您的问题:
Note: Am trying to ignore tabs, newline characters and single line comments. 

Note 2: \/\/[^\r\n]* I have understood where I committed the mistake and wanted to share this.