【问题标题】:Lex won't recognize double operators- !=, :=, <<, etc. Can I give a Lex expression precedence?Lex 无法识别双重运算符 - !=、:=、<< 等。我可以给 Lex 表达式优先级吗?
【发布时间】:2018-10-20 23:19:18
【问题描述】:

尝试解析运算符(+、-、=、

%{
%}
OP  ["+"|";"|":"|","|"*"|"/"|"="|"("|")"|"{"|"}"|"*"|"@"|"$"|
"<"|">"|"&"|"|"|"!"|]
DOUBOP [":="|".."|"<<"|">>"|"<>"|"<="|">="|"=>"|"**"|"!="|"{:"|"}:"|"\-"]

以后

{DOUBOP} { printf("%s (operator)\n", yytext); }
{OP} { printf("%s (operator)\n", yytext); }

但 Lex 将像“

我是否可以给正则表达式优先级,即先对双运算符进行 lex 检查,然后再对单个运算符进行检查?

提前致谢。

【问题讨论】:

    标签: parsing flex-lexer lex


    【解决方案1】:

    [...] 是一个字符类,而不是一个古怪的括号类型。如果要给模式中的子表达式加上括号,请使用普通括号。但是,在这种情况下,括号不是必需的。 (事实上​​,大多数引用也不是必需的,但它们不会造成伤害,其中一些会很有用。)

    "==" 识别由两个等号组成的两个字符序列。 "=="|"++" 识别两个等号或两个加号。

    相比之下,["=="] 识别单个字符,可以是引号或等号。由于一个字符类是一个集合,每个出现两次的事实是无关紧要的(尽管我认为如果 flex 发出警告会省去很多麻烦)。同样,["=="|"&lt;&lt;"] 可以识别单个字符,如果它是引号、等号、竖线或小于号。

    Flex 模式语法记录在flex manual 中。它与其他系统中的正则表达式在一些方面有所不同,因此值得阅读简短的文档。然而,字符类在所有常用的正则表达式语法中基本相同,尤其是使用方括号来分隔集合。

    【讨论】:

      【解决方案2】:

      一种更简单的方法是将所有单个字符放在一起,然后在大括号的末尾运行* 命令。 即

      OP  ["+"|";"|":"|","|"*"|"/"|"="|"("|")"|"{"|"}"|"*"|"@"|"$"|
      "<"|">"|"&"|"|"|"!"|]*
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-25
        • 2011-07-24
        • 2021-10-04
        • 1970-01-01
        • 2020-06-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多