首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在lex中,如何区分'-‘(减法)运算符和整数'-3'?

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

Stack Overflow用户
提问于 2016-02-13 23:44:56
回答 2查看 2.6K关注 0票数 5

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

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

整数的定义如下:整数可以有负号(-),但没有正号。它可以是有或没有空格之间的符号和数字。如果值为0,则只允许使用单个数字0。否则,它与通用整数定义相同(没有前导0‘s)。

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

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

有了这些定义,我想解析字符串- 5 3 ie。(5-3)

电流输出

代码语言:javascript
运行
复制
Integer : - 5, 

Integer : 3

期望产出:

代码语言:javascript
运行
复制
Operator : '-'

Integer : 5

Integer : 3
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-14 03:19:43

不需要。您可以分别向解析器返回-和整数,并让解析器处理一元减号。

票数 6
EN

Stack Overflow用户

发布于 2016-02-13 23:52:58

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

对于简单的语法,您可以通过使用状态(也称为开始条件)使lexer执行解析。在您的示例中,左/右圆括号嵌套将有状态。如果您的语法允许减号和整数之间的行间隔,则需要一种状态来表示您有负号。

只要在一行上识别一个可选的带符号整数,就可以使用如下表达式来完成这一任务

代码语言:javascript
运行
复制
[-]?[[:space:]]*[[:digit:]]+

但是,所需的输出不合并符号和整数。因此,您将有单独的正则表达式,例如,

代码语言:javascript
运行
复制
[-]           { printf ("Operator: %s\n", yytext); }
0|([1-9][0-9]*)  { printf ("Integer: %s\n", yytext); }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35386695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档