ANTLR:乘法省略“*”符号

2024-03-09

我正在尝试创建一个用于乘法和除法的语法,其中不需要包含“*”符号。我需要它来输出 AST。所以对于这样的输入:

1 2 / 3 4

我希望 AST 是

(* (/ (* 1 2) 3) 4)

我发现了以下内容,它使用 java 代码来创建适当的节点:

grammar TestProd;

options {
  output = AST;
}

tokens {
  PROD;
}

DIV :   '/';

multExpr: (INTEGER -> INTEGER)
          ( {div = null;}
            div=DIV? b=INTEGER
                ->
                ^({$div == null ? (Object)adaptor.create(PROD, "*") : (Object)adaptor.create(DIV, "/")}
              $multExpr $b))*
    ;

INTEGER: ('0' | '1'..'9' '0'..'9'*);

WHITESPACE: (' ' | '\t')+ { $channel = HIDDEN; };

这有效。但有更好/更简单的方法吗?


这是一个方法:

grammar Test;

options {
  backtrack=true;
  output=AST;
}

tokens {
  MUL;
  DIV;
}

parse
  : expr* EOF
  ;

expr
  :  (atom -> atom) 
     ( '/' a=atom -> ^(DIV $expr $a)
     | a=atom     -> ^(MUL $expr $a)
     )*
  ;

atom
  :  Number
  |  '(' expr ')' -> expr
  ;

Number
  :  '0'..'9'+
  ;

Space
  :  (' ' | '\t' | '\r' | '\n') {skip();}
  ;

测试用:

import org.antlr.runtime.*;
import org.antlr.runtime.tree.Tree;

public class Main {
    public static void main(String[] args) throws Exception {
        String source = "1 2 / 3 4";
        ANTLRStringStream in = new ANTLRStringStream(source);
        TestLexer lexer = new TestLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        TestParser parser = new TestParser(tokens);
        TestParser.parse_return result = parser.parse();
        Tree tree = (Tree)result.getTree();
        System.out.println(tree.toStringTree());
    }
}

生产:

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

ANTLR:乘法省略“*”符号 的相关文章

  • ANTLR:空条件不起作用

    我希望能够解析int or int tokens 考虑以下语法 TYPE int AFTERINT AFTERINT 当然有效 但仅限于int 为了让它工作int我也变了AFTERINT对此 添加了一个空条件 AFTERINT 但现在我收到
  • 如何管理 ANTLR 中的可选空白?

    我正在尝试解析 ANTLR 中的数据文件 它有可选的空格 例如 3 6 97 12 15 18 下图显示了线的起点和终点 末尾有一个换行符 并且没有制表符 3 6 97 12 15 18 我的语法是 lines line line ws1
  • Antlr 数组帮助

    嘿 我开始在 java 中使用 Antlr 我想知道如何将一些值直接存储到二维数组中并返回该数组 我根本找不到任何关于此的教程 感谢所有帮助 假设您想要解析一个包含由空格分隔的数字的平面文本文件 您想将其解析为二维数组int其中每一行都是数
  • 使用 javax.lang.model 或 ANTLR JavaParser 获取 Java 源代码信息的示例/教程

    我想为简单的 Java 逻辑创建一个自动的类似流程图的可视化 为此我需要解析 Java 源代码 我有 2 个候选者 ANTLR http www antlr org and javax lang model http download or
  • 在侦听器中使用 ParserRuleContext 遍历令牌 - ANTLR4

    在使用侦听器迭代令牌时 我想知道如何使用 ParserRuleContext 来查看令牌流中的下一个令牌或接下来的几个令牌 在下面的代码中 我试图查看当前标记之后直到 EOF 的所有标记 Override public void enter
  • 在antlr中获取纯文本而不是令牌

    我正在尝试使用 antlr 创建一个解析器 我的语法如下 code codeBlock EOF codeBlock text tag1Ops tag2Ops tag1Ops START 1 TAG ID END 2 TAG tag2Ops
  • 为什么 ANTLR4 不匹配单词“of”和标点符号“,”?

    我有一个Hello g4带有语法定义的语法文件 definition wordsWithPunctuation words WORD wordsWithPunctuation word word punctuation word word
  • 将简单的 Antlr 语法转换为 Xtext

    我想将一个非常简单的Antlr语法转换为Xtext 所以没有句法谓词 https stackoverflow com questions 5728659 translate antlr grammar into xtext grammar
  • Antlr4-JS 语法中的操作:如何访问令牌和定义函数? (直接在java中,而不是在JS中)

    我正在努力适应 JS 目标本书的Expr g4 https pragprog com titles tpantlr2 source code 在这个例子中 动作直接在语法中 它们包括 parser members 中定义的实用函数 这些函数
  • 在线验证antlr语法[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道是否存在某种用于antlr语法的在线测试环境 我可以在其中针对某些输入字符串验证和测试给定的语
  • ANTLR:乘法省略“*”符号

    我正在尝试创建一个用于乘法和除法的语法 其中不需要包含 符号 我需要它来输出 AST 所以对于这样的输入 1 2 3 4 我希望 AST 是 1 2 3 4 我发现了以下内容 它使用 java 代码来创建适当的节点 grammar Test
  • ANTLR @header、@parser、superClass 选项和基本文件 io (Java)

    我想将解析器操作与基本文件 io Java 一起使用 例如 G ANTLR 语法中的 PrintWriter 我必须使用 superClass 选项还是可以使用 header 在这两种情况下 我如何声明 PrintWriter 对象以及如何
  • ANTLR4:隐式或显式标记定义

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

    我正在努力将旧的 ANTLR 2 语法转换为 ANTLR 4 但我在字符串规则方面遇到了问题 STRING r n 这创建了一个STRING其文本包含字符串内容的标记 但是不含开始和结束引号 因为 引号文字后面的符号 ANTLR 4 扼流圈
  • Antlr4 语言翻译 - 将模板逻辑与访问者类分开?

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

    我正在尝试实现类似Python的缩进相关语法 来源示例 ABC QWE CDE EFG EFG CDE ABC QWE ZXC 正如我所看到的 我需要的是实现两个标记 INDENT 和 DEDENT 所以我可以编写如下内容 grammar
  • ANTLR“无法启动调试器。等待连接到远程解析器超时。”

    我在 AntlrWorks 中运行的 ANTLR 语法之一抛出 无法启动调试器 等待连接到远程解析器超时 过去 此消息通常会消失 但此消息会持续存在 在搜索 ANTLR 列表时 例如http www antlr org pipermail
  • 在 ANTLR4 中如何检查行的第一个字符是否为“*”?

    我正在尝试为一种相对简单但特殊的语言编写一个解析器 简单地说 规则之一是注释行用星号表示only如果该星号是该行的第一个字符 我如何在 ANTLR4 中正式化这样的规则 我考虑过使用 START LINE COMMENT n n gt sk
  • 自动解析 PHP,将 PHP 代码与 HTML 分离

    我正在开发一个大型 PHP 代码库 我想将 PHP 代码与 HTML 和 JavaScript 分开 我需要对 PHP 代码进行多次自动搜索和替换 对 HTML 进行不同的搜索和替换 对 JS 进行不同的自动搜索和替换 有没有一个好的解析器
  • 有没有使用 ANTLR 或类似语言实现的简单语言?

    我正在尝试构建一种简单的解释语言以用于学习目的 我读过无数关于 ANTLR 和 JavaCC 的理论和教程 但我不知道如何真正让它做一些有用的事情 我通过 把东西拆开然后重新组合起来 来学得最好 那么 是否有任何在 ANTLR 或类似工具的

随机推荐

  • 使用 htaccess 将 HTTP GET 请求重写为 Apache 中的 POST

    我需要更改第三方 PHP 应用程序的行为 并在此后不久恢复更改 如果我可以重写 GET 请求并从中生成 POST 请求 我将节省大量时间 并且可以避免在应用程序中进行任何更改 是否可以改造GEThttp website action1 pa
  • 如何用C语言打印

    一个 C 初学者 事实上这是我的第一个测试程序 我实际上不知道如何将该数字打印到终端 include
  • 我可以同时使用 setupWithNavController 和 setOnNavigationItemSelectedListener

    我有一个带有 BottomNavigationView 的活动 其中包含 5 个项目和片段来显示页面 我将 NavController 设置如下 NavigationUI setupWithNavController mBottomNavi
  • PHP 获取前一个数组元素并知道当前数组键

    我有一个带有特定键的数组 array 420 gt array 430 gt array 555 gt array 在我的应用程序中 我知道当前的密钥 例如555 我想获取前一个数组元素 在此示例中 它是带有键的数组元素430 我怎样才能在
  • MQTT:如何知道 puback 是针对哪条消息的?

    我正在尝试设置一个 MQTT 服务器 它将客户端发送的消息保存到本地数据库中 每条消息都有一个 成功接收 标志 当接收客户端为收到的每条消息 QOS 1 返回 puback 时 我想翻转该标志 问题是 当我发布消息时 服务器正确接收从接收客
  • Symfony 2 多个应用程序?

    这似乎是与 Symfony2 相关的最可怕的话题 因为经过一周的搜索和测试 我仍然找不到答案 简而言之 我正在构建一个具有多个子域的应用程序 我希望为所有子域提供不同的配置 同时共享来自 src 的多个捆绑包 更重要的是 导入中央配置和路由
  • Spring Data JPA:删除乐观锁定语义

    有一个实体Foo with a Version柱子 如果我想删除它 我希望 Spring Data JPA 和 或 Hibernate 检查 Version列与数据库中的列匹配 如果不符合 则应拒绝删除 对于独立实体来说 这可以按预期工作
  • 为什么在 Javascript 的 array.forEach 回调中提供数组参数?

    Javascript 的数组迭代函数 forEach every some等 允许您传递三个参数 当前项 当前索引和正在操作的数组 我的问题是 与通过闭包访问数组相比 将数组作为参数进行操作有什么好处 我为什么要使用这个 myArray f
  • Github Desktop - 作者身份未知

    我正在使用 github 桌面上传一些基本网站的代码 然后使用 github 页面 但是 每次我尝试提交到 main 时 都会出现错误 提示 作者身份未知 我知道我必须将我的姓名和电子邮件放入文件中 但是其中有两个带有 JavaScript
  • 可变参数函数 - 如何确保参数正确传递

    有没有什么方法 内置或代码模式 来确保向可变参数函数传递正确数量的参数 显然 这将作为 API 的一部分包含在内 我可以检查我自己的内部代码 我正在考虑要求 UN32 Magic Number 作为最后一个传递的参数 并检查可变参数函数的有
  • “tensorboard”不被识别为内部或外部命令,

    刚刚开始使用 Tensorflow 但我无法在 cmd 上使用 tensorboard 命令 它给出了错误命令 C Users tushar PycharmProjects gt tensorboard logdir NewTF tenso
  • AngularJS 和 ReactJS 之间的主要区别是什么

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要创建一个将转换为移动应用程序的网站 我想要构建的内容更适合成为网站而不是应用程序 因此建筑物本身应该作为网站 由于我更熟悉桌面和
  • Camel Apache:从接收到的 XML 中提取一些值的 xpath

    在我的 Camel 路由期间 我查询服务器 HTTP GET 结果 我收到一个 200 OK 其 XML 正文看起来类似如下
  • PHP websocket 连接到 node.js 服务器

    我有简单的 node js websocket 服务器 var fs require fs var ws require var options secure false var Server ws createServer options
  • 从 Graph API 中删除照片标签

    我正在尝试创建一个应用程序来帮助用户删除不需要的标签 我听到很多人抱怨 FB 不再允许公众访问删除图片 标签也是如此吗 I get error type OAuthException message 3 Application does n
  • 无法从存储“C:\Users\....\.android\debug.keystore”读取密钥 AndroidDebugKey:密钥库格式无效

    我正在尝试在 android studio 中发布一个简单的项目 所以我转到菜单 gt 构建 gt 构建 apk 但是我收到此错误 Error Execution failed for task app packageDebug gt Fa
  • 将球体映射到立方体

    这里描述了一种将立方体映射到球体的特殊方法 http mathproofs blogspot com 2005 07 mapping cube to sphere html http mathproofs blogspot com 2005
  • INNER JOIN 与“FROM”中的多个表名[重复]

    这个问题在这里已经有答案了 可能的重复 INNER JOIN 与 WHERE 子句 有什么区别 https stackoverflow com questions 1018822 inner join versus where clause
  • 检查引用完整性是否被破坏

    在我的过程中 我做了类似的事情 SET FOREIGN KEY CHECKS 0 LOAD DATA INFILE path to mytable txt INTO TABLE mytable SET FOREIGN KEY CHECKS
  • ANTLR:乘法省略“*”符号

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