C 无法识别Lex中的单行注释
在这个过程中,我正在学习lex,我正在为C语言生成标记,并试图识别单行注释“/”,但与除法运算符有冲突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\
[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.