在 lex 中,如何区分“-”(减法)运算符和整数“-3”?

In lex, how do I differentiate between '-' (subtraction) operator and an integer '-3'?

我正在为一种特定语言编写 lex,其中操作以前缀表示法执行:

(+ a b) --> (a + b)

一个整数定义如下:一个整数可以有一个负号(-)但没有正号。符号和数字之间可以带或不带space(s)。如果值为 0,则只允许单个数字 0。否则,它与普通整数定义相同(没有前导 0)。

lex中的表达式顺序如下(第一个匹配规则):

根据这些定义,我想解析字符串 - 5 3 即。 (5-3)

当前输出

Integer : - 5, 

Integer : 3

期望的输出:

Operator : '-'

Integer : 5

Integer : 3

词法分析器不必这样做:通常解析器(例如使用 yacc 编写的解析器)分别获取减号和整数的标记。解析器根据您提供的规则将两者结合起来。

对于简单的语法,您可以使用 states(也称为开始条件)让词法分析器进行解析。在您的示例中,会有 left/right 括号嵌套的状态。如果您的语法允许在减号和整数之间换行,则您需要一个状态来表明您有一个减号。

只是为了在一行中识别一个可选的有符号整数,您可以使用像

这样的表达式来做到这一点
[-]?[[:space:]]*[[:digit:]]+

但是,您的期望的输出没有结合符号和整数。所以你会有单独的正则表达式,例如,

[-]           { printf ("Operator: %s\n", yytext); }
0|([1-9][0-9]*)  { printf ("Integer: %s\n", yytext); }

你不知道。你把return-和INTEGER分别交给解析器,让解析器处理一元负号。