Operators Flex(词法分析器){+;}和{-}运算符
我正在尝试使用Flex制作一个简单的扫描仪。在声明部分,我试图使用{-}运算符从id中排除保留字,但无法使其工作。我发现的每个示例都使用{+}和{-}运算符,如下代码所示:Operators Flex(词法分析器){+;}和{-}运算符,operators,flex-lexer,Operators,Flex Lexer,我正在尝试使用Flex制作一个简单的扫描仪。在声明部分,我试图使用{-}运算符从id中排除保留字,但无法使其工作。我发现的每个示例都使用{+}和{-}运算符,如下代码所示: [a-z]{-}[d] 但是,我尝试在以下代码中使用这些运算符,但总是出现错误: invalid_id "char"|"else"|"if"|"class"|"new"|"return"|"void"|"while"|"int" all_ids [a-zA-Z_][a-zA-Z0-9_
[a-z]{-}[d]
但是,我尝试在以下代码中使用这些运算符,但总是出现错误:
invalid_id "char"|"else"|"if"|"class"|"new"|"return"|"void"|"while"|"int"
all_ids [a-zA-Z_][a-zA-Z0-9_]*
id {all_ids}{-}{invalid_id}
有什么办法使它起作用吗?这些运算符可以在没有方括号的情况下使用吗?和
{-}
运算符只在[a-z]
之类的字符类上工作,而不在完整的正则表达式或字符串上工作flex
不支持更通用的{-}
运算符。当然,{+}
更通用的版本是|
。通常,如果两个模式匹配同一个字符串,那么将使用第一个模式,这一事实就解决了您的特定问题。因此,将规范更改为以下内容实际上将从ID
s中排除所有关键字
%%
"char"|"else"|"if"|"class"|"new"|"return"|"void"|"while"|"int" { return KEYWORD; }
[a-zA-Z_][a-zA-Z0-9_]* { return ID; }
%%