编写对空格敏感的解析器规则,同时从词法分析器中跳过 WS

2024-02-12

我在处理空白时遇到一些麻烦。在以下语法摘录中,我设置了词法分析器,以便解析器跳过空格:

ENTITY_VAR
    : 'user'
    | 'resource'
    ;

INT : DIGIT+ | '-' DIGIT+ ;
ID : LETTER (LETTER | DIGIT | SPECIAL)* ;
ENTITY_ID : '__' ENTITY_VAR ('_w_' ID)?;

NEWLINE : '\r'? '\n';

WS : [ \t\r\n]+ -> skip; // skip spaces, tabs, newlines

fragment LETTER : [a-zA-Z];
fragment DIGIT : [0-9];
fragment SPECIAL : ('_' | '#' );

问题是,我想匹配表单的变量名称ENTITY_ID使得匹配的字符串没有任何空格。像我在这里所做的那样将其编写为词法分析器规则就足够了,但问题是我想用解析器规则来代替,因为我想直接访问这两个标记ENTITY_VAR and ID单独从我的代码中取出,而不是将它们压缩到一个完整的令牌中ENTITY_ID.

有什么想法吗? 基本上任何让我直接访问的解决方案ENTITY_VAR and ID适合我,离开ENTITY_ID作为词法分析器规则或将其移至解析器。


我能想到的有几种方法(排名不分先后):

  1. 从规则中发出多个令牌ENTITY_ID. See ANTLR4:如何注入代币 https://stackoverflow.com/questions/18001009/antlr4-how-to-inject-tokens寻求灵感
  2. 在解析器中允许空格并随后检查
  3. 使用单个令牌并拆分代码
  4. 使用单个令牌并修改令牌流before将其传递给解析器。 IE。莱克斯,修改ENTITY_ID令牌并将它们拆分为几个其他令牌,然后将此流传递给解析器
  5. 不要跳过空格,并且在处理这些“额外标记”时检查它们是否在ENTITY_ID部分(=> 是错误)或不是(=> 忽略错误)。
  6. 不要跳过空格并在语法中允许空格的任何地方添加“WS*”(如果语法不是太大,则可以)。
  7. 在解析器规则中插入谓词,检查之间是否有空格。
  8. 创建一个像这样的“陷阱”规则:

    INVALID_ENTITY_ID : '__' WS+ ENTITY_VAR WS? ('_w_' WS? ID)?
                      | '__' WS? ENTITY_VAR WS+ ('_w_' WS? ID)?
                      | '__' WS? ENTITY_VAR WS? ('_w_' WS+ ID)
                      ;
    

    这会捕获无效的ENTITY_IDs,因为它比也将成为单独标记的部分更长。

我会选择 2,如果它不会改变“非错误”情况下的解析,即没有代码因允许空格而被不同地解释。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写对空格敏感的解析器规则,同时从词法分析器中跳过 WS 的相关文章

  • 在哪里可以找到 MATLAB 的形式语法?

    我想编写一个词法分析器生成器 将 MATLAB 语言的基本子集转换为 C C 等 为了帮助我做到这一点 我想找到一个包含 MATLAB 形式语法的文档 花了一些时间调查这一点 Mathworks 似乎没有提供这一点 有谁知道我在哪里可以找到
  • Antlr4-JS 语法中的操作:如何访问令牌和定义函数? (直接在java中,而不是在JS中)

    我正在努力适应 JS 目标本书的Expr g4 https pragprog com titles tpantlr2 source code 在这个例子中 动作直接在语法中 它们包括 parser members 中定义的实用函数 这些函数
  • 转换为乔姆斯基范式

    我确实需要你的帮助 我有这些作品 1 A gt aAb 2 A gt bAa 3 A gt 我应该应用乔姆斯基范式 CNF 为了应用上述规则 我应该 消除 产生式 消除单一生产 删除无用的符号 我立即陷入困境 原因是 A 是一个可为空的符号
  • Antlr4 - 有使用 ParseTree Walker 的简单示例吗?

    Antlr4 有一个新类 ParseTreeWalker 但我该如何使用它呢 我正在寻找一个最小的工作示例 我的语法文件是 gram g4 我想解析文件 program txt 到目前为止 这是我的代码 这假设 ANTLR 已经运行了我的语
  • ANTLR4 将 ParserRuleContext 树展平为数组

    如何压平一个ParserRuleContext将子树放入令牌数组中 这ParserRuleContext getTokens int ttype 看起来不错 但什么是ttype 是token类型吗 如果我想包含所有令牌类型 应使用什么值 P
  • ANTLR:乘法省略“*”符号

    我正在尝试创建一个用于乘法和除法的语法 其中不需要包含 符号 我需要它来输出 AST 所以对于这样的输入 1 2 3 4 我希望 AST 是 1 2 3 4 我发现了以下内容 它使用 java 代码来创建适当的节点 grammar Test
  • 如何在action方法中获取匹配的token参数值?

    如果我的语法中有这样的内容 grammar G token tab indent Int level Using just level would require to have the same effect so use a code
  • Java、C++、C# 等如何通过 < 和 > 解决这种特定的语法歧义?

    我曾经认为 C 是一种 奇怪 的语言 它与 lt and gt 但是在尝试实现解析器之后 我想我发现了一个打破的例子大概every java中的通用方法调用是
  • 如何使用 preg_match_all() 获取子组匹配的所有捕获? [复制]

    这个问题在这里已经有答案了 更新 注意 我想我可能正在寻找的是得到捕获一组 https stackoverflow com questions 6571106 can you retrieve multiple regex matches
  • 即使不匹配,ANTLR 词法分析器规则也会消耗字符吗?

    我有一个 antlr 词法分析器规则的奇怪副作用 并且我创建了一个 几乎 最小的工作示例来演示它 在这个例子中我想匹配字符串 0 1 例如 但是当我调试语法时 到达解析器的令牌流仅包含 1 第一个整数 无论 它包含多少位数字 总是会被消耗
  • ANTLR4:隐式或显式标记定义

    在 ANTLR4 中使用显式标记定义有哪些优点和缺点 我发现单括号中的文本比创建单独的标记并使用它代替文本更具描述性且更易于使用 E g grammar SimpleTest top library module library libra
  • Perl 6 语法与我认为的不匹配

    我正在做代码出现第 9 天 http adventofcode com 2017 day 9 您坐了一会儿并记录了流的一部分 您的谜题输入 这些字符代表组 开头的序列 并结束于 在一个组内 有零个或多个其他东西 用逗号分隔 要么是另一个组
  • ANTLR“无法启动调试器。等待连接到远程解析器超时。”

    我在 AntlrWorks 中运行的 ANTLR 语法之一抛出 无法启动调试器 等待连接到远程解析器超时 过去 此消息通常会消失 但此消息会持续存在 在搜索 ANTLR 列表时 例如http www antlr org pipermail
  • 使用 Antlr4 解析任意分隔符

    我尝试在 Antlr4 中创建一个接受正则表达式的语法由任意字符分隔 与 Perl 中的类似 我怎样才能实现这个目标 需要明确的是 我的问题不是正则表达式本身 实际上我不在 Antlr 中处理 而是在访问者中处理 而是分隔符 我可以轻松地为
  • Antlr 处理异常

    我使用 Antlr 3 和 AST 树开发了一个复杂的语法 ANTLR 生成词法分析器和解析器 问题是 例如 当用户输入无效的语法时 该语法需要 用户没有输入此内容 然后在我的 Eclipse IDE 中出现以下异常 line 1 24 m
  • 使用antlr4获取预处理器行并解析C代码

    我正在使用 Antlr4 来解析 C 代码 并使用以下语法来解析 链接到 C g4 https github com antlr grammars v4 blob master c C g4 上面的语法默认不提供任何解析规则来获取预处理器语
  • 无法弄清楚为什么 Bison 抛出“由于冲突,规则在解析器中无用”

    我正在为一种非常简单的编程语言编写 BNF 语法 并使用 Flex 和 Bison 进行编译 我只有 3 种变量和常量类型 实数 整数 字符串 我的 l 文件具有 ID 的标记定义 如下所示 DIGIT 0 9 LETTER a zA Z
  • 是否有一个实用程序可以在给定 ANTLR 语法的情况下生成匹配的字符串?

    我有一个 ANTLR 语法 我想模 糊我的解析器 您是否正在寻找 CFG 语法的生成 IE 语法接受的字符串的生成 这可能是检查语法正确性的好主意 但请记住 可接受的字符串集很可能是无限的 任何真正严重的错误应该已经在语法规范中显而易见 并
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • ANTLR4 词法分析器无法解决语法顺序中的歧义

    使用 ANTLR 4 2 我尝试对此测试数据进行非常简单的解析 RRV0 ABC 使用最小语法 grammar Tiny thing RRV N HASH ID RRV RRV N 0 9 HASH ID a zA Z0 9 WS t r

随机推荐

  • 如何知道 Xcode 中是否触摸了 .png 的唯一可见区域

    我已将 png 图像导入到UIImageView在 Xcode 中 我想要做的是当触摸图像时 它将被隐藏 但我的问题是 png 图像包含透明部分 当我触摸透明部分时 动作会继续 我希望仅当图像的可见部分被触摸时动作才继续 如何解决问题 Sw
  • 在 CSP 中不使用“unsafe-eval”的 Vuejs 浏览器扩展

    我使用 Vuejs 构建了一个浏览器插件 并使用 Laravel Mix 作为我的构建过程 我的所有 vue 模板都在单个文件组件中 一切都工作得很好 直到我从插件清单中的 CSP 中删除 unsafe eval 火狐浏览器显示错误 Con
  • 从 Lua 中的(最简单的)函数直接返回表条目

    我想编写最简单的函数 让我在无名表中返回所需的值 并且 ideally 它应该是这样的 function RL MyTool Version n return 0 4 0 20221003 0230 13 5 5 n end 但是 当然 这
  • 在 HTML/CSS 中创建列的最佳方法

    我正在寻找一种显示 3 列内容的方法 我找到了一种显示环绕列的方法 但我不希望在该页面上使用这种方法 我正在寻找一种方式来表达
  • 导入错误:Mac 上没有名为 lxml 的模块

    我在运行 Python 脚本时遇到问题 它显示以下消息 ImportError No module named lxml 我想我必须安装一些名为 lxml 的东西 但我确实是 Python 的新手 对此我并没有太多的想法 根据我在其他线程中
  • PHP 中的自动加载器 - 一次运行两个

    我了解如何注册自动加载器 甚至如何创建自动加载器 这根本不是问题 主要问题是 如何让两个自动装载机并排运行以执行以下操作 class project one folder class extends project two folder c
  • 如何在 Java 中播放声音?

    我希望能够在我的程序中播放声音文件 我应该去哪里看 我编写了以下代码 效果很好 但我认为它只适用于 wav format public static synchronized void playSound final String url
  • OpenSSL 中 PEM 格式的默认密码是什么?

    我使用 openssl 生成密钥 证书 openssl exe req x509 days 1000 newkey rsa 1024 keyout key pem out cert pem 它提示输入密码 我猜测密码是用于密钥加密的 但是我
  • ALV网格只加载前64行,如何更改默认加载

    情况 我已经为 SAP GUI 脚本创建了一个查找功能 如果网格行在特定列中具有特定值 则双击它 这会触发加载特定的相关数据 我的网格少于 300 行 因此加载如此多的数据不会对现代计算机造成压力 Issue 我遇到的问题是 从 SAPGr
  • 从模板中的 django 表单中仅获取一个字段

    我有一种形式 class FormLogin forms Form email forms EmailField max length 150 name forms CharField max length 20 如何在模板中仅添加电子邮件
  • 注册的elephantbird仍然显示错误2998

    grunt gt register home piyush Desktop pro json simple 1 1 1 jar grunt gt register home piyush Desktop pro elephant bird
  • Netlogo中有NOOP吗?

    我正在寻找一种在 netlogo 中什么也不做的方法 在其他编程语言中 这称为无操作方法 有没有办法可以在 netlogo 中做到这一点 您可以非常轻松地编写自己的无操作过程 to no op end usage to go no op e
  • 将画布原点设置为左下角

    有没有办法将原点设置为画布的左下角 我尝试按 1 缩放 但之后一切都颠倒了 我需要制作类似坐标系的东西 但只有正部分 第一象限 所以我需要它从左下角的 0 0 开始 ctx translate 0 canvas height ctx sca
  • 任何仅忽略“连接由对等方重置”IOExceptions 的方法

    由于网络问题 我对来自套接字读取调用的大量 IOException 感到非常恼火 通常 这仅意味着有人杀死了子进程或网络严重故障 VPN 连接断开等 我的服务器无法执行任何操作 但我真的不想在日志文件中看到所有这些错误 java中有没有办法
  • 为什么张量流分类器在移动设备上的准确度低于笔记本电脑

    我使用 2 个 googleCodelabs 重新训练了自定义张量流模型 其链接如下 诗人 1 的 Tensorflow https codelabs developers google com codelabs tensorflow fo
  • 使用 WordPress $wpdb 将数据插入 WordPress 数据库中的表中

    我正在开始插件开发 并已按照 WordPress Codex 网站上的教程进行操作 我现在陷入困境 我有一个名为 wp imlisteningto 的数据库 其中wp 插入使用 table name wpdb gt prefix imlis
  • “功能”和“功能”有什么区别!在 VIM 中?

    我看到很多 函数 的用法 在其他 vimrc 文件中 但没有易于找到的 function 文档 功能 和 功能 有什么区别 help user functions 当具有此名称的函数已存在且 为未使用时会给出错误消息 当使用 时 现有功能会
  • 向 TinyMCE 文本区域添加边框半径

    是否可以为 TinyMCE 的文本区域添加边框半径 我的输入字段等上有圆角 但我无法让它在我的文本区域上工作 这有点杀了我 可能是因为 TinyMCE 将它变成了 IFRAME 有没有办法解决 多谢 一种解决方案是使用editor css设
  • Tomcat JDBC 连接池:testOnBorrow 与 testWhileIdle

    由于各种原因 池中的连接可能会变得无效 服务器连接超时 网络问题 我的理解是 Tomcat JDBC 连接池不对其向应用程序提供的连接的有效性提供任何保证 为了防止 实际上只是降低风险 从池中获取无效连接 解决方案似乎是配置连接验证 验证连
  • 编写对空格敏感的解析器规则,同时从词法分析器中跳过 WS

    我在处理空白时遇到一些麻烦 在以下语法摘录中 我设置了词法分析器 以便解析器跳过空格 ENTITY VAR user resource INT DIGIT DIGIT ID LETTER LETTER DIGIT SPECIAL ENTIT