Lex 无法识别双重运算符 - !=、:=、<< 等。我可以赋予 Lex 表达式优先级吗?
Lex won't recognize double operators- !=, :=, <<, etc. Can I give a Lex expression precedence?
尝试使用
等状态解析运算符(+、-、=、<<、!=)
%{
%}
OP ["+"|";"|":"|","|"*"|"/"|"="|"("|")"|"{"|"}"|"*"|"@"|"$"|
"<"|">"|"&"|"|"|"!"|]
DOUBOP [":="|".."|"<<"|">>"|"<>"|"<="|">="|"=>"|"**"|"!="|"{:"|"}:"|"\-"]
以后
{DOUBOP} { printf("%s (operator)\n", yytext); }
{OP} { printf("%s (operator)\n", yytext); }
但 Lex 将“<<”等运算符识别为“<”和“<”。我认为因为它是用双引号引起来的,所以这会起作用,但我发现情况并非如此。
我是否可以给出正则表达式优先级,即让 lex 先检查双运算符,然后再检查单运算符?
提前致谢。
[...]
是一个字符class,不是括号的怪异类型。如果要在模式中用括号括起子表达式,请使用普通括号。然而,在这种情况下,括号不是必需的。 (事实上 ,大多数引用也不是必需的,但它们不会造成伤害,其中一些会很有用。)
"=="
识别由两个等号组成的两个字符序列。 "=="|"++"
识别两个等号或两个加号。
相比之下,["=="]
识别单个字符,可以是引号或等号。由于字符 class 是一个集合,因此每个字符出现两次这一事实是无关紧要的(尽管我认为如果 flex 发出警告会避免很多麻烦)。同样,["=="|"<<"]
识别引号、等号、竖线或小于号中的单个字符。
Flex 模式语法记录在 flex manual 中。它与其他系统中的正则表达式有一些不同,因此值得阅读这篇简短的文档。然而,字符 classes 在所有常用的正则表达式语法中大部分是相同的,尤其是使用方括号来分隔集合。
更简单的方法是将所有单个字符放在一起,运行 *
命令以大括号结尾。
即
OP ["+"|";"|":"|","|"*"|"/"|"="|"("|")"|"{"|"}"|"*"|"@"|"$"|
"<"|">"|"&"|"|"|"!"|]*
尝试使用
等状态解析运算符(+、-、=、<<、!=)%{
%}
OP ["+"|";"|":"|","|"*"|"/"|"="|"("|")"|"{"|"}"|"*"|"@"|"$"|
"<"|">"|"&"|"|"|"!"|]
DOUBOP [":="|".."|"<<"|">>"|"<>"|"<="|">="|"=>"|"**"|"!="|"{:"|"}:"|"\-"]
以后
{DOUBOP} { printf("%s (operator)\n", yytext); }
{OP} { printf("%s (operator)\n", yytext); }
但 Lex 将“<<”等运算符识别为“<”和“<”。我认为因为它是用双引号引起来的,所以这会起作用,但我发现情况并非如此。
我是否可以给出正则表达式优先级,即让 lex 先检查双运算符,然后再检查单运算符?
提前致谢。
[...]
是一个字符class,不是括号的怪异类型。如果要在模式中用括号括起子表达式,请使用普通括号。然而,在这种情况下,括号不是必需的。 (事实上 ,大多数引用也不是必需的,但它们不会造成伤害,其中一些会很有用。)
"=="
识别由两个等号组成的两个字符序列。 "=="|"++"
识别两个等号或两个加号。
相比之下,["=="]
识别单个字符,可以是引号或等号。由于字符 class 是一个集合,因此每个字符出现两次这一事实是无关紧要的(尽管我认为如果 flex 发出警告会避免很多麻烦)。同样,["=="|"<<"]
识别引号、等号、竖线或小于号中的单个字符。
Flex 模式语法记录在 flex manual 中。它与其他系统中的正则表达式有一些不同,因此值得阅读这篇简短的文档。然而,字符 classes 在所有常用的正则表达式语法中大部分是相同的,尤其是使用方括号来分隔集合。
更简单的方法是将所有单个字符放在一起,运行 *
命令以大括号结尾。
即
OP ["+"|";"|":"|","|"*"|"/"|"="|"("|")"|"{"|"}"|"*"|"@"|"$"|
"<"|">"|"&"|"|"|"!"|]*