我正在为特定语言编写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
答案 0 :(得分:4)
你没有。将for
和INTEGER分别返回给解析器,让解析器处理一元减号。
答案 1 :(得分:0)
词法分析器不必这样做:通常解析器(例如使用yacc编写的解析器)分别获得减号和整数的标记。解析器根据您提供的规则将两者结合起来。
对于简单的语法,您可以使用状态(也称为开始条件)使词法分析器进行解析。在您的示例中,左/右括号嵌套会有状态。如果你的语法允许在减号和整数之间换行,你需要一个状态来表明你有一个减号。
只需在一行中识别一个可选的有符号整数,就可以使用像
这样的表达式[-]?[[:space:]]*[[:digit:]]+
但是,所需的输出不会将符号和整数组合在一起。所以你会有那些单独的正则表达式,例如,
[-] { printf ("Operator: %s\n", yytext); }
0|([1-9][0-9]*) { printf ("Integer: %s\n", yytext); }