我正在为一种特定的语言编写lex,其中的操作是以前缀表示法执行的:
(+ a b) --> (a + b)
整数的定义如下:整数可以有负号(-),但没有正号。它可以是有或没有空格之间的符号和数字。如果值为0,则只允许使用单个数字0。否则,它与通用整数定义相同(没有前导0‘s)。
lex中表达式的顺序如下(第一个匹配规则):
[\-]?[ ]*((0)|([1-9][0-9]*))
"-"
有了这些定义,我想解析字符串- 5 3
ie。(5-3)
电流输出
Integer : - 5,
Integer : 3
期望产出:
Operator : '-'
Integer : 5
Integer : 3
发布于 2016-02-14 03:19:43
不需要。您可以分别向解析器返回-
和整数,并让解析器处理一元减号。
发布于 2016-02-13 23:52:58
lexer不必这样做:通常解析器(例如使用yacc编写的解析器)分别获取减号和整数的标记。解析器根据您提供的规则将两者结合在一起。
对于简单的语法,您可以通过使用状态(也称为开始条件)使lexer执行解析。在您的示例中,左/右圆括号嵌套将有状态。如果您的语法允许减号和整数之间的行间隔,则需要一种状态来表示您有负号。
只要在一行上识别一个可选的带符号整数,就可以使用如下表达式来完成这一任务
[-]?[[:space:]]*[[:digit:]]+
但是,所需的输出不合并符号和整数。因此,您将有单独的正则表达式,例如,
[-] { printf ("Operator: %s\n", yytext); }
0|([1-9][0-9]*) { printf ("Integer: %s\n", yytext); }
https://stackoverflow.com/questions/35386695
复制相似问题