ANTLR 中的浮点文字和范围参数

2023-11-30

我正在开发 D 语言的解析器,当我尝试添加“切片”运算符规则时遇到了麻烦。你可以找到它的ANTLR语法here。 基本上问题是,如果词法分析器遇到这样的字符串:“1..2”,它就会完全丢失,并且最终成为单个浮点值,因此像“a[10..”这样的字符串的后缀表达式规则。 11]" 最终成为带有 ExpLiteralReal 参数的 ExpArrIndex 对象。有人可以解释一下数字文字到底有什么问题吗? (据我所知,它在这些令牌周围的某个地方失败了)


您可以通过发出两个令牌(一个Int and Range令牌)当你遇到".."在浮动规则内。您需要重写词法分析器中的两个方法才能完成此任务。

一个包含您的一小部分的演示Dee语法:

grammar Dee;

@lexer::members {

  java.util.Queue<Token> tokens = new java.util.LinkedList<Token>();

  public void offer(int ttype, String ttext) {
    this.emit(new CommonToken(ttype, ttext));
  }

  @Override
  public void emit(Token t) {
    state.token = t;
    tokens.offer(t);
  }

  @Override
  public Token nextToken() {
    super.nextToken();
    return tokens.isEmpty() ? Token.EOF_TOKEN : tokens.poll();
  }
}
parse
 : (t=. {System.out.printf("\%-15s '\%s'\n", tokenNames[$t.type], $t.text);})* EOF
 ;

Range
 : '..'
 ;

IntegerLiteral 
 : Integer IntSuffix?
 ;

FloatLiteral 
 : Float ImaginarySuffix? 
 ;

// skipping
Space
 : ' ' {skip();}
 ;

// fragments
fragment Float
 : d=DecimalDigits ( options {greedy = true; } : FloatTypeSuffix 
                   | '..' {offer(IntegerLiteral, $d.text); offer(Range, "..");}
                   | '.' DecimalDigits DecimalExponent?
                   )
 | '.' DecimalDigits DecimalExponent?
 ;

fragment DecimalExponent : 'e' | 'E' | 'e+' | 'E+' | 'e-' | 'E-' DecimalDigits;
fragment DecimalDigits   : ('0'..'9'|'_')+ ;
fragment FloatTypeSuffix : 'f' | 'F' | 'L';
fragment ImaginarySuffix : 'i';
fragment IntSuffix       : 'L'|'u'|'U'|'Lu'|'LU'|'uL'|'UL' ;
fragment Integer         : Decimal| Binary| Octal| Hexadecimal ;
fragment Decimal         : '0' | '1'..'9' (DecimalDigit | '_')* ;
fragment Binary          : ('0b' | '0B') ('0' | '1' | '_')+ ;
fragment Octal           : '0' (OctalDigit | '_')+ ;
fragment Hexadecimal     : ('0x' | '0X') (HexDigit | '_')+;  
fragment DecimalDigit    : '0'..'9' ;
fragment OctalDigit      : '0'..'7' ;
fragment HexDigit        : ('0'..'9'|'a'..'f'|'A'..'F') ;

使用类测试语法:

import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    DeeLexer lexer = new DeeLexer(new ANTLRStringStream("1..2 .. 33.33 ..21.0"));
    DeeParser parser = new DeeParser(new CommonTokenStream(lexer));
    parser.parse();
  }
}

当你跑步时Main,产生以下输出:

IntegerLiteral  '1'
Range           '..'
IntegerLiteral  '2'
Range           '..'
FloatLiteral    '33.33'
Range           '..'
FloatLiteral    '21.0'

EDIT

是的,正如您在评论中指出的那样,词法分析器规则只能发出 1 个单个标记。But,正如您自己已经尝试过的那样,语义谓词确实可以用于强制词法分析器在字符流中向前查看,以确保实际上存在".."IntegerLiteral尝试匹配之前的令牌FloatLiteral.

以下语法将产生与第一个演示相同的标记。

grammar Dee;

parse
 : (t=. {System.out.printf("\%-15s '\%s'\n", tokenNames[$t.type], $t.text);})* EOF
 ;

Range
 : '..'
 ;

Number
 : (IntegerLiteral Range)=> IntegerLiteral {$type=IntegerLiteral;}
 | (FloatLiteral)=>         FloatLiteral   {$type=FloatLiteral;}
 |                          IntegerLiteral {$type=IntegerLiteral;}
 ;

// skipping
Space
 : ' ' {skip();}
 ;

// fragments
fragment DecimalExponent : 'e' | 'E' | 'e+' | 'E+' | 'e-' | 'E-' DecimalDigits;
fragment DecimalDigits   : ('0'..'9'|'_')+ ;
fragment FloatLiteral    : Float ImaginarySuffix?;
fragment IntegerLiteral  : Integer IntSuffix?;
fragment FloatTypeSuffix : 'f' | 'F' | 'L';
fragment ImaginarySuffix : 'i';
fragment IntSuffix       : 'L'|'u'|'U'|'Lu'|'LU'|'uL'|'UL' ;
fragment Integer         : Decimal| Binary| Octal| Hexadecimal ;
fragment Decimal         : '0' | '1'..'9' (DecimalDigit | '_')* ;
fragment Binary          : ('0b' | '0B') ('0' | '1' | '_')+ ;
fragment Octal           : '0' (OctalDigit | '_')+ ;
fragment Hexadecimal     : ('0x' | '0X') (HexDigit | '_')+;  
fragment DecimalDigit    : '0'..'9' ;
fragment OctalDigit      : '0'..'7' ;
fragment HexDigit        : ('0'..'9'|'a'..'f'|'A'..'F') ;
fragment Float
 : d=DecimalDigits ( options {greedy = true; } : FloatTypeSuffix 
                   | '.' DecimalDigits DecimalExponent?
                   )
 | '.' DecimalDigits DecimalExponent?
 ;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ANTLR 中的浮点文字和范围参数 的相关文章

  • 用于计算类数的部分语法

    我需要计算正确的 C 源文件中的类数量 我写了以下语法 grammar CSharpClassGrammar options language CSharp2 parser namespace CSharpClassGrammar Gene
  • 如何使用Antlr实现函数调用,以便在定义之前就可以调用它?

    一旦构建了 AST 实现树遍历器以便可以按任意顺序定义和调用函数的最佳方法是什么 例如 这在 PHP 中是有效的 我猜想一定有第二遍 或者树转换 但我在这个主题上找不到任何有趣的东西 这个问题可能不是 Antlr 特有的问题 但如果你能给我
  • 将 Antlr 语法树转换为有用的对象

    我目前正在考虑如何最好地获取使用 Antlr 生成的 AST 并将其转换为可以在我的程序中使用的有用对象 我语法的目的 除了学习之外 是创建一种可执行 运行时解释 语言 例如 我将如何获取属性子树并实例化特定的属性类 例如 以下代码用我的语
  • Antlr4-JS 语法中的操作:如何访问令牌和定义函数? (直接在java中,而不是在JS中)

    我正在努力适应 JS 目标本书的Expr g4 https pragprog com titles tpantlr2 source code 在这个例子中 动作直接在语法中 它们包括 parser members 中定义的实用函数 这些函数
  • Antlr 语法生成无效的 C# 代码

    我正在尝试使用 ANTLR 和 StringTemplate 库开发一个 C 代码生成器 AntlrWorks 可以生成 C 解析器和词法分析器文件 而不会报告任何错误 但是 c 解析器代码无效 无法在 Visual Studio 中编译
  • 将 ANTLR 语法翻译为 XText 语法:如何删除句法谓词

    我对 Xtext 和 ANTLR 都很陌生 我需要将 ANTLR g 语法转换为 XTEXT xtext 语法 在 ANTLR 语法中 存在 Xtext 不支持的语法谓词 有没有办法删除 翻译这些谓词 Thanks EDIT 我尝试翻译的
  • ANTLRWorks 1.4.3 无法正确读取扩展 ASCII 字符

    我正在开发一个相当标准的编译器项目 我选择 ANTLR 作为解析器生成器 在将现有语法从 v2 更新到 v3 时 我注意到 ANTLRWorks ANTLR 的官方 IDE 无法正确显示文件中的任何扩展 ASCII 字符 即使使用 Note
  • ANTLR4:隐式或显式标记定义

    在 ANTLR4 中使用显式标记定义有哪些优点和缺点 我发现单括号中的文本比创建单独的标记并使用它代替文本更具描述性且更易于使用 E g grammar SimpleTest top library module library libra
  • ANTLR4 相当于什么!在词法分析器规则中?

    我正在努力将旧的 ANTLR 2 语法转换为 ANTLR 4 但我在字符串规则方面遇到了问题 STRING r n 这创建了一个STRING其文本包含字符串内容的标记 但是不含开始和结束引号 因为 引号文字后面的符号 ANTLR 4 扼流圈
  • D 的写法是什么?

    我用 C 写了这个程序 http pastebay com 182597并且在二郎中 http pastebay com 185244 为了练习 我尝试用 D 重写 一个朋友也用 D 写了它 但是写得不同 https stackoverfl
  • D有“新类型”吗?

    D 是否有 newtype 如 Haskell 中 这是一个天真的问题 因为我只是浏览 D 但谷歌没有找到任何有用的东西 在 Haskell 中 这是一种在编译时使同一事物的不同类型变得不同的方法 但不会导致任何运行时性能损失 例如你可以为
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 编程语言解析器的来源?

    我正在清理我的一个旧项目 该项目计算有关大型软件项目的许多简单指标 指标之一是文件 类 方法的长度 目前 我的代码 猜测 类 方法边界的位置基于非常粗略的算法 遍历文件 维护 当前深度 并在遇到未加引号的括号时调整它 当您返回到类或方法开始
  • 在 GTK+ (gtkD) 中处理按键

    我正在玩gtkD http www dsource org projects gtkd GTK 的 D 绑定 我有一个window对象 实例gtk MainWindow 我想处理它的按键 How 如何处理特殊键 例如箭头键 pgup pgd
  • 堆分配什么的语法?

    是否有语法 模板或函数允许我将任何值本质上转换为指向该值的指针 IE 将其复制到GC堆并返回指向它的指针 new 并不适用于所有类型 std experimental allocator 不适用于 ctfe 并且两者似乎都在指向委托时遇到了
  • ANTLR 获取并拆分词法分析器内容

    首先 对我的英语感到抱歉 我还在学习 我为我的框架编写 Python 模块 用于解析 CSS 文件 我尝试了 regex ply python 词法分析器和解析器 但我发现自己在 ANTLR 中 第一次尝试 我需要解析 CSS 文件中的注释
  • Antlr3 匹配没有空格的标记

    给定输入 term gt 1 数字 1 和比较运算符 gt 应该在 AST 中生成单独的节点 如何才能实现这一目标 在我的测试中 仅当 c 和 1 用空格分隔时才会发生匹配 如下所示 term lt 1 当前语法 startExpressi
  • 我正在尝试为 Antlr4 Python3.g4 语法文件生成解析树,以解析 python3 代码

    我正在使用 ANTLR4 并尝试为我拥有的 python 文件生成解析树 我使用了 ANTLR4 文档中的语法文件 python3 g4 我安装了antlr4 python3 runtime 并且运行了以下命令 antlr4 Dlangua
  • Xtext和ANTLR之间有什么关系?

    我听说Xtext最终使用ANTLR 但他们的语法规范文件的格式有些不同 那么两者之间是什么关系呢 Xtext 依赖于 Antlr 解析器生成器来解析输入文件 除此之外 该框架还提供了许多附加值 例如强类型 AST 链接抽象和静态分析以及 E
  • 在简单整数列表语法中使用 AntLR4 中的访问者

    我是 AntLR 的新手 我使用的是AntLR4版本 我编写了以下属性语法 它识别整数列表并在末尾打印列表的总和 list g4 grammar list header import java util List import java u

随机推荐

  • 将对 Laravel Controller 的请求路由到正在运行的 WebSocket 服务器

    情况 有一个长时间运行的任务需要异步启动 此任务的细节实际上并不是那么重要 基础知识是要配置多个虚拟机和复杂的网络设置 并且这是由将在不同服务器上运行的 python 脚本处理的 我们决定使用 WebSockets 在 Web 服务器和客户
  • 在Dispose(bool)方法实现中,不应该将成员设置为null吗?

    没有任何讨论的指南 注释 文章IDisposable模式建议应该将内部成员设置为null in the Dispose bool 方法 特别是如果它们是占用内存的野兽 在调试内部基准测试工具时 我开始意识到它的重要性 过去发生的情况是 有一
  • 验证 XSD 本身

    谁能告诉我如何验证 XSD 文件本身 不是针对 XSD 的 XML 我检查了许多论坛和网站 包括 SO 其中大多数都引用了某些或其他在线验证器 但这对我们来说不是一次性检查 我们的应用程序涉及使用 XSD 的 XSL 转换 因此我们需要确定
  • 检测两个数字相加时是否发生无符号整数溢出

    这是我的实现 用于检测尝试添加两个数字时是否发生无符号整数溢出 我的系统上 unsigned int UINT MAX 的最大值是 4294967295 int check addition overflow unsigned int a
  • 允许 VB.NET 应用程序将 Excel 文件转换为数据表

    我的 VB NET 应用程序目前允许我将 CSV 文件转换为数据表 这要归功于以下提供的代码David在这个问题中我发布了 上一个问题 现在我尝试允许将 XLSX 文件导入到数据表中 目前代码如下所示 Private Function Co
  • 在 PostgreSQL 中,关于 citext 性能的奇怪问题?

    In PostgreSQL 手册它说citext只是一个实现的模块TEXT调用的数据类型LOWER citext模块提供了不区分大小写的字符串类型 citext 本质上 它在比较值时在内部调用 lower 否则 它的行为几乎与文本完全相同
  • 如何在iOS中动态解析JSON

    我们使用了第三方服务 它提供了一个 JS 文件 js文件发起http请求 得到一个json 我们解析json 得到了我们想要的内容 但是json格式总是在变化 有没有办法解析 json 但不更新我们的应用程序 不断更改架构听起来非常愚蠢 但
  • 使用 IN 和 python 列表构建 SQL 查询字符串

    我建立了一个对熊猫感兴趣的价值观列表 table1 pd read csv logswithIPs csv cips data dash ip unique tolist print cips 10 111 111 111 111 123
  • Hibernate、iBatis 还是其他?

    在我的项目中 我需要在运行时在数据库之间切换 我尝试使用 Hibernate 但陷入了一个需要将对象与数据库中的表映射的地方 问题是 我有几个带有前缀的表 documents2001 documents2002 据我所知 我无法在运行时将类
  • 如何用 R 绘制风向和风速(速度图)

    基本上我有两个矩阵 u和v 的列表 其中包含经度和纬度方向的风速 以及包含坐标的向量x和y 我想制作一张带有指向结果方向的箭头的地图 其大小与风速成正比 这个问题之前有人问过 http www mail archive com 电子邮件受保
  • plotly.js 中是否可以有水平颜色条

    我正在plotly js 中使用等值线图 有没有办法让颜色条比例在图表底部水平显示 而不是沿右侧或左侧垂直显示 作为参考 请查看 Plotly 站点上给出的第一个示例https plot ly javascript choropleth m
  • dw、db 和 是什么意思? (问号)TASM 结构中的意思是什么?

    我是装配新手 现在我想弄清楚dw db and 意思是在一个struc 例如这里 struc segment descriptor seg length0 15 dw base addr0 15 dw base addr16 23 db f
  • 如何让 R 接受自签名证书

    我有使用 RGoogleAnaytics 包的以下代码 require RGoogleAnalytics client id lt XX client secret lt YY token lt Auth client id client
  • 选择 Linq 分组依据的特定列

    我有一个嵌套的 ListView 有点像这个 http mattberseth com blog 2008 01 building a grouping grid with html 以及以下 Linq 查询 var query from
  • PHP foreach() 仅返回最后 50 项

    我当前正在使用以下 PHP 代码来返回 htm 文件的输出并对其进行格式化
  • 我可以从 .gradle 文件中的 groovy 方法调用 gradle 任务吗?

    我在 gradle 中有一个非常规的构建脚本 它可以循环编译项目 更改为标准 gradle 构建需要几周的时间 所以现在不会发生这种情况 问题是我想停止在脚本中使用 ant 并转而仅使用 groovy gradle 问题是如何更改复制等任务
  • 使用 VBA for Excel 从大范围单元格中删除“额外”空格(超过 1 个)的更快方法

    如何从包含文本字符串的大范围单元格中更快地删除多余空格 假设有 5000 个细胞 我尝试过的一些方法包括 For Each c In range c Value Trim c Value Next c and For Each c In r
  • 你会如何解析 Markdown? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 编辑 我最近了解了一个名为
  • C# 停止执行直到事件发生

    我需要停止执行程序 直到用户单击按钮 我正在进行离散事件模拟 现在的目标是提供简单的图形来说明情况 当模拟达到值得展示的事件时 将调用绘制情况的方法 我需要该方法在用户单击按钮之前不跳回到模拟核心 只有在到达有趣的点时才再次调用 您可以创建
  • ANTLR 中的浮点文字和范围参数

    我正在开发 D 语言的解析器 当我尝试添加 切片 运算符规则时遇到了麻烦 你可以找到它的ANTLR语法here 基本上问题是 如果词法分析器遇到这样的字符串 1 2 它就会完全丢失 并且最终成为单个浮点值 因此像 a 10 这样的字符串的后