在 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中的表达式顺序如下(第一个匹配规则):
- 整数的正则表达式:
[\-]?[ ]*((0)|([1-9][0-9]*))
- 减法运算符的正则表达式:
"-"
根据这些定义,我想解析字符串 - 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分别交给解析器,让解析器处理一元负号。
我正在为一种特定语言编写 lex,其中操作以前缀表示法执行:
(+ a b) --> (a + b)
一个整数定义如下:一个整数可以有一个负号(-)但没有正号。符号和数字之间可以带或不带space(s)。如果值为 0,则只允许单个数字 0。否则,它与普通整数定义相同(没有前导 0)。
lex中的表达式顺序如下(第一个匹配规则):
- 整数的正则表达式:
[\-]?[ ]*((0)|([1-9][0-9]*))
- 减法运算符的正则表达式:
"-"
根据这些定义,我想解析字符串 - 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分别交给解析器,让解析器处理一元负号。