如何解决2+2和2++2冲突

2024-04-10

在更大的程序中,我给出了以下内容(flex/bison)

In flex:

pn [\+|\-]
dig [0-9]+
exp [e|E]{dig}+

.

.

.

"+"             {printf("+ detected\n");
                return PLUS_SIGN;}




{pn}?{dig}+         { printf("digit detected - %s\n",yytext);
                sscanf(yytext, "%d", (int*)&yylval);
                return TYPE_INT;}

在野牛中:

expr:
    expr PLUS_SIGN expr
      {
        $$ = $1 + $3;
        printf(" $$=%f\n",$$);
      }
    | TYPE_INT
      {     
        $$ = (int)$1;
        printf(" $$=%f\n",$$);
      }
;

问题是:

当我给出 2+2 时,它识别 2 和 +2 而不是 2 、 + 、 2

我怎样才能让它做加法?


{pn}?{dig}+

不要使用加号或减号 ({pn?}) 数字标记的一部分。将它们视为两个单独的令牌,+ and 2。那么flex就不会有任何需要解决的歧义了。

{dig}+

相反,让 bison 处理一元加号和减号运算符。让它成为解析器的工作,而不是词法分析器的工作。

| PLUS_SIGN expr
  {
    $$ = +$2;
    printf(" $$=%f\n",$$);
  }
| MINUS_SIGN expr
  {
    $$ = -$2;
    printf(" $$=%f\n",$$);
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决2+2和2++2冲突 的相关文章

随机推荐

  • 推送通知徽章未到来

    我正在使用此编码进行苹果推送通知 推送通知即将到来 但它们没有任何徽章 任何建议此代码有什么问题 我没有收到徽章 我已经检查了设置选项卡 徽章就在那里 BOOL application UIApplication application d
  • CircleCI Android ConstraintLayout 不起作用

    我现在正在使用CircleCI对于我的项目 我也在实施新的约束布局在我的项目中 现在我被 CircleCI 大楼困住了 它向我展示了这个gradle 依赖项 run File home ubuntu android repositories
  • X 轴垂直线 iOS 图表

    也许这是一个简单的问题 但我想知道如何在 iOS 图表中的 X 轴下绘制垂直线和 X 轴上的标签 见图 如红线所示 更新 我正在使用的库是这个https github com danielgindi ios charts https git
  • 显示 JPanel 调整了另一个 JPanel 的大小

    我有一个关于嵌套 BoxLayout 的问题 我想构建一个由 2 个子面板组成的 DropDownPanel 顶部的标题和底部的正文 身体最初是隐藏的 通过单击标题 您可以切换正文的可见性并显示其内容 例如展开 折叠 一般来说 这工作得很好
  • “cabal install cabal-install”不会更新 OSX 中的 cabal 版本

    我是 haskell 和 cabal 的新手 所以我可能错过了一些简单的东西 我更新了 cabal install sudo cabal install cabal install Password Resolving dependenci
  • 如何使用 Git API 获取 GitHub 存储库的社交预览图像链接?

    我拥有许多 GitHub 存储库 通常每周添加项目 我正在使用 GitHub 页面制作自己的网站 因为我只能在 GitHub 页面上托管静态网站 因此我将使用 GitHub API 来自动更新网站上的新项目 但我还想向其中添加预览 示例图像
  • 无法切换到打瞌睡模式

    我正在遵循这方面的说明安卓页面 http developer android com training monitoring device state doze standby html为了将 android 切换到 doz 模式来测试我的
  • 如何构建增量有向非循环词图来存储和搜索字符串?

    我试图以简洁的方式存储大量字符串列表 以便可以非常快速地分析 搜索它们 有向非循环词图 DAWG 非常适合这个目的 但是 我首先没有要包含的字符串列表 因此它必须是可增量构建的 此外 当我在其中搜索字符串时 我需要带回与结果相关的数据 而不
  • 如何重用现有分支名称作为新分支?

    我的目的是拥有一个开发分支 我可以在其中创建功能分支 这些功能分支将被合并到 dev 分支 然后 dev 分支将被合并回 master 一些我如何搞砸了 我留下了我的开发分支 所以这就是我现在所拥有的 我认为将password rest a
  • 支持 RecyclerView 在触摸之前不显示任何内容

    我在我的应用程序中使用支持 RecyclerView 我看到了最奇怪的事情 在我触摸滚动之前它不会显示任何项目 然后 突然间 RecyclerView 就会自行填充 我已经验证支持适配器的列表已填充 并且 onCreatViewHolder
  • Oracle 11 SQL:有没有办法将 1 行拆分为 x 行

    客户要求将 Oracle DB SQL 中的 1 行拆分为 6 行 比方说 最初的 SQL 具有多个连接的复杂 sql 等 拉入 9 列 从 X Y Z 中选择 A B C D E F G H I 但查询相当复杂 1 A B C D E F
  • 查询中的 Firebase StartAfter 未按预期工作

    我使用 firebase firestore 作为数据库 并且编写了 firebase 函数来从 firestore 数据库检索数据 我想要实现的是分页 根据文档我已经实现了我的 firebase 函数的代码 下面是代码 exports g
  • Python 中的隔离森林

    我目前正在使用以下方法检测数据集中的异常值隔离森林 https scikit learn org stable modules generated sklearn ensemble IsolationForest html在 Python
  • AttributeError:使用 CRF 时“Tensor”对象没有属性“_keras_history”

    我知道关于这个问题有很多问题 我已经阅读了其中的一些问题 但没有一个对我有用 I am trying to build a model with the following architecture 代码如下 token inputs In
  • sys.stdout.flush 在 jupyter 笔记本中不起作用

    所以我只想重新运行此存储库中的代码 https github com dennybritz reinforcement learning blob master MC MC 20Prediction 20Solution ipynb htt
  • 如何正确重写 JacksonAnnotationIntrospector._findAnnotation 以替换元素的注释

    我正在尝试创建一些可由杰克逊序列化的类 我想用标准 Jackson 注释来注释一些元素 让我们考虑一下JsonIgnore对于这个例子 但我希望它们只在我的特定映射器中有效 因此 我决定创建自己的注释 例如标准注释 例如 MyJsonIgn
  • 在现有表上创建序列

    如何在表上创建一个序列 使其从 0 gt 最大值 我尝试使用以下 SQL 代码 但它不会将任何值插入到我正在使用的表中 CREATE SEQUENCE rid seq ALTER TABLE test ADD COLUMN rid INTE
  • 如何修复信号器的 ChunkLoadError

    我在本地运行我的 nx 站点时遇到问题 任何使用 signalR 的联合应用程序都开始抛出 ChunkLoadError 我尝试过更改 signalR 的版本 重新加载 清除缓存并单独运行我的联合应用程序 结果总是一样的 Uncaught
  • 如何找到 Discord 机器人所连接的语音聊天

    我正在制作一个通过语音识别激活的不和谐机器人 我一开始就让他加入语音频道 正在运行 我试图发出命令让他离开 const commando require discord js commando class LeaveChannelComma
  • 如何解决2+2和2++2冲突

    在更大的程序中 我给出了以下内容 flex bison In flex pn dig 0 9 exp e E dig printf detected n return PLUS SIGN pn dig printf digit detect