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

时间:2016-02-13 23:44:56

标签: flex-lexer lex lexical-analysis

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

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

整数定义如下:整数可以有负号( - )但没有正号。它可以在符号和数字之间有或没有空格。如果值为0,则仅允许单个数字0。否则,它与常见的整数定义相同(无前导0)。

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

  • 整数的正则表达式:[\-]?[ ]*((0)|([1-9][0-9]*))
  • 减法运算符的正则表达式:"-"

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

当前输出

Integer : - 5, 

Integer : 3

期望的输出:

Operator : '-'

Integer : 5

Integer : 3

2 个答案:

答案 0 :(得分:4)

你没有。将for和INTEGER分别返回给解析器,让解析器处理一元减号。

答案 1 :(得分:0)

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

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

只需在一行中识别一个可选的有符号整数,就可以使用像

这样的表达式
[-]?[[:space:]]*[[:digit:]]+

但是,所需的输出不会将符号和整数组合在一起。所以你会有那些单独的正则表达式,例如,

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