在antlr中获取纯文本而不是令牌

2024-01-09

我正在尝试使用 antlr 创建一个解析器。我的语法如下。

code : codeBlock* EOF;

codeBlock
: text
| tag1Ops
| tag2Ops
;

tag1Ops: START_1_TAG ID END_2_TAG ;

tag2Ops: START_2_TAG ID END_2_TAG ;

text: ~(START_1_TAG|START_2_TAG)+;

START_1_TAG : '<%' ;
END_1_TAG : '%>' ;
START_2_TAG : '<<';
END_2_TAG : '>>' ;

ID : [A-Za-z_][A-Za-z0-9_]*;
INT_NUMBER: [0-9]+;

WS :  ( ' ' | '\n' | '\r' | '\t')+ -> channel(HIDDEN);

SPACES: SPACE+;

ANY_CHAR : .;

fragment SPACE : ' ' | '\r' | '\n' | '\t' ;

除了各种标签之外,我还需要实现一个规则来获取不在任何标签内的文本。当前语法似乎运行良好,但由于“文本”规则属于词法分析器一侧,因此输入的任何文本都会被标记化,并且我会得到一个标记列表,而不是单个字符串标记。 intellij 中的 antlr 分析器还显示每个标记的不明确调用。

例如,“嗨你好,你好吗?”需要是单个标记,而不是由该语法生成​​的多个标记。

我想我可能看错了角度,并且想知道是否有其他方法来处理“文本”规则。


第一:你有一个WS将空格字符放置在隐藏通道上的规则,但在语法的后面,您有一个SPACES规则。鉴于这种SPACES规则放置在WS并且匹配完全相同,SPACES规则永远不会被匹配。

例如,“嗨你好,你好吗?”需要是单个标记,而不是由该语法生成​​的多个标记。

在当前的设置中您无法执行此操作。你能做的就是利用词汇模式 https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md#lexical-modes。一个快速演示:

// Must be in a separate file called DemoLexer.g4
lexer grammar DemoLexer;

START_1_TAG : '<%' -> pushMode(IN_TAG);
START_2_TAG : '<<' -> pushMode(IN_TAG);
TEXT        : ( ~[<] | '<' ~[<%] )+;

mode IN_TAG;
  ID         : [A-Za-z_][A-Za-z0-9_]*;
  INT_NUMBER : [0-9]+;
  END_1_TAG  : '%>' -> popMode;
  END_2_TAG  : '>>' -> popMode;
  SPACE      : [ \t\r\n] -> channel(HIDDEN);

要测试此词法分析器语法,请运行此类:

import org.antlr.v4.runtime.*;

public class Main {

  public static void main(String[] args) {

    String source = "<%FOO%>FOO BAR<<123>>456 mu!";
    DemoLexer lexer = new DemoLexer(CharStreams.fromString(source));
    CommonTokenStream tokenStream = new CommonTokenStream(lexer);
    tokenStream.fill();

    for (Token t : tokenStream.getTokens()) {
      System.out.printf("%-20s %s\n", DemoLexer.VOCABULARY.getSymbolicName(t.getType()), t.getText());
    }
  }
}

这将打印:

START_1_TAG          <%
ID                   FOO
END_1_TAG            %>
TEXT                 FOO BAR
START_2_TAG          <<
INT_NUMBER           123
END_2_TAG            >>
TEXT                 456 mu!
EOF                  <EOF>

在单独的解析器语法中使用词法分析器语法,如下所示:

// Must be in a separate file called DemoParser.g4
parser grammar DemoParser;

options {
  tokenVocab=DemoLexer;
}

code
 : codeBlock* EOF
 ;

...

EDIT

[...]但我对文本有点困惑:( ~[规则。你能进一步详细说明它的作用吗?

细分( ~[<] | '<' ~[<%] )+:

(            # start group
  ~[<]       #   match any char other than '<'
  |          #   OR
  '<' ~[<%]  #   match a '<' followed by any char other than '<' and '%'
)+           # end group, and repeat it once or more

并且,词汇模式可以被视为语义谓词的替代吗?

有点。语义谓词更强大:您可以通过纯代码检查其中您喜欢的任何内容。然而,一个很大的缺点是你在语法中混合了目标特定的代码,而词法模式适用于所有目标。因此,经验法则是尽可能避免谓词。

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

在antlr中获取纯文本而不是令牌 的相关文章

  • 删除这种左递归方式来定义 SELECT 语句

    我正在尝试解析以下内容SELECT陈述 select 1 union all select 1 union all with cte as select 1 select 1 from tbl limit 1 union all selec
  • 将 xtext 编辑器支持与外部 ANTLR 解析器链接起来

    我当前的项目 将其命名为 IoTSuite 采用高级规范 解析它们 并生成 Java 和 Android 代码 在这个项目中 我编写了 ANTLR 语法来解析高级规范 并使用 StringTemplate 作为代码生成器 然而 由于良好的编
  • Webpack 错误-configuration.node 有一个未知的属性“fs”

    我在使用最新版本的Webpack 5 1 0 时遇到错误 看起来配置抛出了错误 因为验证模式限制太多 这是我的 webpack 配置文件的要点 以及我看到的错误消息 Webpack config js https gist github c
  • ANTLR @header、@parser、superClass 选项和基本文件 io (Java)

    我想将解析器操作与基本文件 io Java 一起使用 例如 G ANTLR 语法中的 PrintWriter 我必须使用 superClass 选项还是可以使用 header 在这两种情况下 我如何声明 PrintWriter 对象以及如何
  • ANTLRWorks 1.4.3 无法正确读取扩展 ASCII 字符

    我正在开发一个相当标准的编译器项目 我选择 ANTLR 作为解析器生成器 在将现有语法从 v2 更新到 v3 时 我注意到 ANTLRWorks ANTLR 的官方 IDE 无法正确显示文件中的任何扩展 ASCII 字符 即使使用 Note
  • 即使不匹配,ANTLR 词法分析器规则也会消耗字符吗?

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

    我试图理解 ANTLR 4 中的解析树匹配 所以为此 我有以下java代码 package sampleCodes public class fruits public static void main String args int a
  • C# ANTLR 语法?

    我正在寻找交钥匙ANTLR http www antlr org C 语法 生成可用的抽象语法树 AST 并且与后端语言无关或以 C C C 或 D 为目标 它不需要支持错误报告 附 我不愿意做任何修复 因为替代方案并不难 这可能太晚了 但
  • ANTLR4 Lexer 错误报告(违规字符的长度)

    我正在使用 ANTLR4 为某些语言开发一个小型 IDE 并且需要在词法分析器无法匹配错误字符时给它们下划线 内置的org antlr v4 runtime ANTLRErrorListener http www antlr org api
  • Antlr4 语言翻译 - 将模板逻辑与访问者类分开?

    我正在考虑实用地将大量相对简单的 TSQL 代码转换为 Groovy 代码 肯定有很多原因 但驱动因素只是想看看是否可以完成 并在此过程中了解编译器 语法 等 Antlr4 似乎是解决这个问题的理想工具 Java 是一个优点 标记化 解析
  • ANTLR 嵌套函数

    ANTLR 适合这个项目吗 我正在寻找处理和转换用户输入的字符串 其中可能包含自定义函数 例如 用户可能会在字符串中写入类似 CAPITALIZE word 的内容 而我想执行 使用 StringUtils 在后台进行实际转换 我想用户有时
  • ANTLR4性能问题

    关于 ANTL4 解析的性能已经有一些讨论 例如 Antlr 4 解析大型 c 文件需要很长时间 https stackoverflow com questions 19311864 antlr 4 parsing large c file
  • 使用 Antlr4 解析任意分隔符

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

    我正在使用 Antlr4 来解析 C 代码 并使用以下语法来解析 链接到 C g4 https github com antlr grammars v4 blob master c C g4 上面的语法默认不提供任何解析规则来获取预处理器语
  • 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
  • ANTLR 获取并拆分词法分析器内容

    首先 对我的英语感到抱歉 我还在学习 我为我的框架编写 Python 模块 用于解析 CSS 文件 我尝试了 regex ply python 词法分析器和解析器 但我发现自己在 ANTLR 中 第一次尝试 我需要解析 CSS 文件中的注释
  • antlr4-tool 在 Win10 中失败,并显示:错误:命令失败:哪个 java

    在Win10中运行 为了尝试在Node JS中创建解析器 我安装了ANTLR4工具 npm install save dev antlr4 tool Ran c prj parser node modules bin antlr4 tool
  • 如果输入无效,是否可以抛出异常?

    我有一个简单的 ANLTR 语法和随附的访客 一切都很好 除非输入无效 如果输入无效 错误就会被吞噬 并且我的计算器会输出错误的输出 我尝试过实现一个错误侦听器 超越Recover词法分析器的方法 还有 好吧 今天还有六件事 有人可以告诉我
  • ANTLR 中的布尔和算术表达式语法

    我正在尝试编写算术和布尔表达式的语法 我不明白我做错了什么 对于我的语法 ANTLR 说 致命 规则logic atom 由于可从 alts 1 2 到达的递归规则调用而具有非 LL 决策 通过左分解或使用语法谓词或使用 backtrack
  • 字符串模板:使所有变量声明全局

    我正在尝试使用 ANTLR StringTemplate 实现翻译器 我有一种类似于 java 的起始语言和多种目标语言 我用了这个例子 http www antlr org wiki display ST Language Transla

随机推荐

  • ZeroMQ:重新绑定套接字时地址使用错误

    将 ZeroMQ 套接字绑定到端点并关闭套接字后 将另一个套接字绑定到同一端点需要多次尝试 之前的调用zmq bind直到成功失败并出现错误 地址正在使用 EADDRINUSE 下面的代码演示了这个问题 include
  • 是否有一个好的数据结构可以执行查找、并集和解并操作?

    我正在寻找一种可以相当有效地支持并集 查找和解并的数据结构 一切至少 O log n 或更好 因为标准的不相交集结构不支持解并 作为背景 我正在用 MCTS 编写 Go AI http en wikipedia org wiki Monte
  • SSL 和 SocketChannel

    理想情况下 我只需要一个简单的SSLSocketChannel 我已经有一个可以通过普通方式读取和写入消息的组件SocketChannel 但对于其中一些连接 我必须通过网络使用 SSL 然而 这些连接上的操作是相同的 有谁知道免费的SSL
  • 如何在VBA中清空数组?

    我正在开发一个与 COM 服务器交换对象的 Excel VBA 插件 如下所示 get an array of objects Dim Ents As ISomething ComObject GetEntities Ents send a
  • log4j 记录两次

    我正在使用 log4j 来记录错误和其他系统信息 但来自在信息级别记录两次的信息 public static void main final String args throws Exception LOGGER info program
  • Java弹跳球

    我正在尝试编写一个Java应用程序 它在屏幕上绘制多个从框架边缘弹起的球 我能成功抽出一个球 然而 当我添加第二个球时 它会覆盖我绘制的初始球 代码是 import java awt import javax swing import ja
  • 从 iPhone 中的音乐文件中获取 NSData

    我已从我的 iPhone 设备中检索了所有音乐和视频 我现在困于将这些保存到我的应用程序中 我无法从文件中获取原始数据 任何人都可以帮我找到解决方案吗 这是我用来获取音乐文件的代码 MPMediaQuery deviceiPod MPMed
  • Urllib2 和 BeautifulSoup :不错的一对,但太慢 - urllib3 和线程?

    当我听到有关线程和 urllib3 的一些好消息时 我正在寻找一种方法来优化我的代码 显然 人们不同意哪种解决方案是最好的 下面我的脚本的问题是执行时间 太慢了 Step 1 我获取此页面 Step 2 我用 BeautifulSoup 解
  • 如何在错误时继续执行sql脚本?

    我们有几个迁移脚本 它们会根据版本更改架构 有时 迁移步骤 例如 向表添加列 已经手动或通过补丁安装完成 因此迁移脚本失败 如何防止脚本因错误而停止 最好是在特定的预期错误时 而是记录消息并继续执行脚本 我们使用 PostgresQL 9
  • 如何将库与 webpack 捆绑在一起?

    我想创建一个前端库 因此我想使用webpack 我特别喜欢 CSS 和图像加载器 但是 如果我使用 webpack 我只能需要非 JS 文件 因为我正在建立一个图书馆 所以我不能保证我的图书馆的用户也会这样做 有没有办法将所有内容捆绑到 U
  • 如何以编程方式向以编程方式创建的 UIView 添加约束?

    我在 viewDidLoad 中使用以下代码创建了一个 UIView 其中 secondview 显然是 UIView 的名称 secondview UIView alloc initWithFrame self view frame se
  • 无法打开依赖项文件 SwiftStdLibToolInputDependency.dep

    我正在使用 Siri Shortcuts 开发 iOS objc 应用程序 我一切正常but当我添加意图扩展 以处理后台支持 并尝试运行该应用程序时 我收到错误 Intent Extension的IntentHandler只有默认的实现 错
  • 另一个函数内的函数前向声明

    代码先行 void foo int x void bar int is this forward decl legal bar x void bar int x do stuff 在上面的代码中 foo calls bar 通常我把前向声明
  • 使用 ROOM 和 @Database 注解执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生故障

    我正在使用 Room 进行离线存储 我的模型包含 Room 不支持的列表 并且我编写了类型转换器 但现在我收到此错误 当我删除 Database 注释时 错误就会出现 但使用 Database 注释时 它会显示错误 这是我所有相关的课程 这
  • 加载图像的 jQuery 事件

    是否可以通过 jQuery 事件检测所有图像何时加载 理想情况下 应该有一个 document idle function or document contentLoaded function 但我找不到这样的东西 我想附加一个这样的事件
  • 使用 Node.js 设置语言提示的 Google Vision API 文本检测

    我在用着 google cloud vision使用 Node js 我使用如下示例代码 async function quickstart try Imports the Google Cloud client library const
  • 如何从 Perl 创建然后使用长 Windows 路径?

    我有一个构建过程的一部分 它在 Windows 中创建了一条长得可怕的路径 这不是我的错 它有几个目录深 并且没有一个目录名异常长 它们又长又多 足以让它过去MAX PATH 260 个字符 我在这些名称中没有使用除 ASCII 之外的任何
  • Java jar 文件未在 Linux 终端中运行

    我正在尝试运行 jar在 Linux 上的终端中输入文件但出现错误 root localhost dist java jar helloworld jar Exception in thread main java lang ClassFo
  • Java 线程与 Pthreads

    我今天在接受采访时被问到这个问题 当我们创建一个线程时pthread create POSIX 线程 线程自行启动 为什么我们需要显式调用start 在爪哇 当我们创建线程实例时 Java 不启动线程的原因是什么 我脑子一片空白 面试官时间
  • 在antlr中获取纯文本而不是令牌

    我正在尝试使用 antlr 创建一个解析器 我的语法如下 code codeBlock EOF codeBlock text tag1Ops tag2Ops tag1Ops START 1 TAG ID END 2 TAG tag2Ops