Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >为什么Antlr默认使用某些替代方案而不是其他方案?

为什么Antlr默认使用某些替代方案而不是其他方案?
EN

Stack Overflow用户
提问于 2018-02-09 20:42:19
回答 1查看 170关注 0票数 1

我正在使用IntelliJ的antlr4插件为我正在处理的一个项目创建语法。在学习如何使用antlr的过程中,我查看了Github用户shmatov的简单antlr4计算器,如下所示。

代码语言:javascript
代码运行次数:0
复制
grammar Calculator;
INT    : [0-9]+;
DOUBLE : [0-9]+'.'[0-9]+;
PI     : 'pi';
E      : 'e';
POW    : '^';
NL     : '\n';
WS     : [ \t\r]+ -> skip;
ID     : [a-zA-Z_][a-zA-Z_0-9]*;

PLUS  : '+';
EQUAL : '=';
MINUS : '-';
MULT  : '*';
DIV   : '/';
LPAR  : '(';
RPAR  : ')';

input
    : plusOrMinus NL? EOF # Calculate
    ;

plusOrMinus 
    : plusOrMinus PLUS multOrDiv  # Plus
    | plusOrMinus MINUS multOrDiv # Minus
    | multOrDiv                   # ToMultOrDiv
    ;

multOrDiv
    : multOrDiv MULT pow # Multiplication
    | multOrDiv DIV pow  # Division
    | pow                # ToPow
    ;

pow
    : unaryMinus (POW pow)? # Power
    ;

unaryMinus
    : MINUS unaryMinus # ChangeSign
    | atom             # ToAtom
    ;

atom
    : PI                    # ConstantPI
    | E                     # ConstantE
    | DOUBLE                # Double
    | INT                   # Int
    | ID                    # Variable
    | LPAR plusOrMinus RPAR # Braces
    ;

有趣的是,当输入一个数字时,比如整数'5',生成的解析树显示运行# Plus和# Multiplication标签。这对我来说没有多大意义。输入中没有+*运算符。我已经上传了下面的解析树的图像,以便更好地了解我正在谈论的内容。

看起来antlr只是默认使用规则中的第一个替代项,但是计算器直接通过标签# Calculate -> # ToMultOrDiv -> # ToPow -> # ToAtom -> # Int不是更有意义吗?如果没有正确的运算符,它是如何通过# Plus和# Multiplication的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-09 21:05:56

观察得很好!我猜ANTLR插件不能正确显示标签。你可以在这里打开一个问题:https://github.com/antlr/intellij-plugin-v4/issues (编辑,我自己打开了一个问题:https://github.com/antlr/antlr4/issues/2222)

当您让输入"5"通过侦听器时,您将看到显示了正确的路径:

代码语言:javascript
代码运行次数:0
复制
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTreeWalker;

public class Main {

    static class Listener extends CalculatorBaseListener {

        @Override
        public void enterCalculate(CalculatorParser.CalculateContext ctx) {
            System.out.println("Calculate");
        }

        @Override
        public void enterToMultOrDiv(CalculatorParser.ToMultOrDivContext ctx) {
            System.out.println("ToMultOrDiv");
        }

        @Override
        public void enterToPow(CalculatorParser.ToPowContext ctx) {
            System.out.println("ToPow");
        }

        @Override
        public void enterPower(CalculatorParser.PowerContext ctx) {
            System.out.println("Power");
        }

        @Override
        public void enterToAtom(CalculatorParser.ToAtomContext ctx) {
            System.out.println("ToAtom");
        }

        @Override
        public void enterInt(CalculatorParser.IntContext ctx) {
            System.out.println("Int");
        }
    }

    public static void main(String[] args) {
        CalculatorLexer lexer = new CalculatorLexer(CharStreams.fromString("5"));
        CalculatorParser parser = new CalculatorParser(new CommonTokenStream(lexer));
        ParseTreeWalker.DEFAULT.walk(new Listener(), parser.input());
    }
}

它将打印:

代码语言:javascript
代码运行次数:0
复制
Calculate
ToMultOrDiv
ToPow
Power
ToAtom
Int
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48713795

复制
相关文章
IDEA配置,自动将less文件转化为.css文件并压缩为.min.css文件
在idea插件市场中 搜索 Files Watcher 并安装,安装完成后重启 idea
Neil223
2022/07/23
1.3K0
【CSS】CSS 层叠样式表 ① ( 简介 | CSS 引入方式 - 内联样式 | 内联样式语法 | 内联样式缺点 )
CSS 全称 Cascading Style Sheets , 层叠样式表 ; 作用如下 :
韩曙亮
2023/03/30
4.8K0
【CSS】CSS 层叠样式表 ① ( 简介 | CSS 引入方式 - 内联样式 | 内联样式语法 | 内联样式缺点 )
如何在 Linux 中将 CSV 文件转换为 TSV 文件?
在Linux操作系统中,可以使用各种命令和工具来处理和转换文本文件。当需要将以逗号分隔的CSV文件转换为以制表符分隔的TSV文件时,可以使用一些简单的命令和技巧来实现。本文将详细介绍如何在Linux中将CSV文件转换为TSV文件。
网络技术联盟站
2023/06/20
1.1K0
如何在 Linux 中将 CSV 文件转换为 TSV 文件?
如何在 React TypeScript 中将 CSS 样式作为道具传递?
React 是一种流行的 JavaScript 库,用于构建动态用户界面。最近,它与 TypeScript 的结合变得越来越流行。由于 TypeScript 的静态类型检查和更好的 IDE 支持,它使得使用 React 更加容易和可维护。当开发 React 应用程序时,我们通常需要使用 CSS 样式来渲染组件。本文将介绍如何在使用 React TypeScript 时,将 CSS 样式作为道具(Props)传递给组件。
网络技术联盟站
2023/06/07
2.2K0
CSS 块元素、内联元素、内联块元素
元素就是标签,布局中常用的有三种标签,块元素、内联元素、内联块元素,了解这三种元素的特性,才能熟练的进行页面布局。
Devops海洋的渔夫
2019/05/31
3.9K0
外部css文件调用
1 <link rel="stylesheet" href="body.css" type="text/css"> 2   <body> <div class="left">    <p><a href="index.jsp">上传文件</a></p>    <p><a href="download.jsp">下载文件</a></p>    <p><a href="rename.jsp">修改文件名</a></p>    <p><a href="delete.jsp">删除文件</a>
闵开慧
2018/03/30
2.6K0
Webpack打包CSS文件
output是输出文件的文件名,和输出到什么位置,__dirname是用来动态获取当前文件所属目录的绝对路径,后面的build是我的一个文件夹,这个你们填自己的就好
小丞同学
2021/08/16
1K0
CSS文件夹
  网上冲浪时发现的瑰宝,特别适合刚学习过 transform 的同学拿来练习,也比较适合前端大能拿来复习CSS 。素材来源于 “ 站长之家 ”
我不是费圆
2020/10/10
1.2K0
CSS文件夹
使用express框架,如何在ejs文件中导入外部的js、css文件
最近在用nodejs写一点东西,当然也用到了express框架和ejs模版了。在使用ejs模版的过程中遇到了这个问题:如何在ejs模版中导入外部的js、css文件。
acoolgiser
2019/04/18
6.4K0
使用express框架,如何在ejs文件中导入外部的js、css文件
外部css文件引入失效
好久没有写过前端代码了,有次引入bootstrap css文件在浏览器却没有获取到css文件,检查下文件路径没错,也不存在权限问题,后来仔细看了下自己引入css文件的link,发现少了东西。以下是原来写的代码:
全栈程序员站长
2021/05/19
2.4K0
WordPress 主题教程 #9:Style.css 和 CSS 介绍
Style.css 和 CSS 介绍是从零开始创建 WordPress 主题系列教程的第九篇,学习 CSS 最好的方法就是去使用它,不像 XHTML 和 PHP 需要接触模板的核心文件,同样不要需要理解任何基本概念,只要去用它,通过试用和修正错误是可以让你快速学会。
Denis
2023/04/15
7740
WordPress 主题教程 #9:Style.css 和 CSS 介绍
如何在Linux中将文本内容追加到文件末尾?
在Linux中处理配置文件时,有时您需要将诸如配置参数之类的文本附加到现有文件中。追加只是意味着将文本添加到文件的末尾。
用户6543014
2020/03/06
14.6K0
如何在Linux中将文本内容追加到文件末尾?
使用express框架开发,如何在ejs文件中导入外部的js、css文件
首先看一下这篇文章: https://blog.csdn.net/MPFLY/article/details/78134980
acoolgiser
2019/04/18
9.9K0
使用express框架开发,如何在ejs文件中导入外部的js、css文件
如何在vue组件中引入外部的css和js文件[通俗易懂]
在使用vue框架开发时,我们都知道一个组件中可以同时写HTML、css、js代码,只需三个标签而已,如下:
全栈程序员站长
2022/11/09
8.8K0
JS动态添加/删除css文件
Jensen_97
2023/07/20
6400
html CSS引用字体文件
有的网站字体,用户电脑上没有,如果只是单纯的定义 font-family 是不起效的。
德顺
2019/11/13
6.4K0
【工具】fis3 - 语法教程(1)之资源嵌入
需要注意的是,在组件化开发方面,fis是不建议使用“资源嵌入”的方式作为组件化拆分的手段,后面讲到的“声明依赖”能力会更适合组件化开发。
前端修罗场
2023/10/07
1430
Django静态文件(CSS,JS等)
静态文件是指js,css,图片等文件。render可以返回模板文件(HTML),但是缺少了js,css。在Django中我们一般会指定一个目录存放静态文件,这样方便管理。在现在前后端分离的大环境之下,静态文件我们几乎也用不到。另外在HTML中调用的时候也需要指定静态文件的路径。一般都会将静态文件放置在项目的根目录下。要使用静态文件,需要配置两个参数。
zy010101
2021/10/09
2.8K0
Django静态文件(CSS,JS等)
Bear CSS:基于 HTML 文件快速创建基本的 CSS 样式
当你创建一个网页的时候,一般会先创建 HTML 文件,然后在写 CSS 样式,当然也可以一边写 HTML 结构,一遍写样式。如果你是采用第一种方法,那么你在写 CSS 样式的时候,会很烦,因为要复制粘贴 class 和 id 名,其实可以通过 Bear CSS 这个服务,基于现有的 HTML 创建基本的 CSS 样式:
Denis
2023/04/14
1K0
Bear CSS:基于 HTML 文件快速创建基本的 CSS 样式
Nuxt.js 开发SSR(服务端渲染)Web应用
Nuxt.js 能够胜任 VuePress 的功能,但它专为构建应用程序而设计,而 VuePress 更适合构建以内容为中心的静态站点,如技术文档,博客等。
我是一条小青蛇
2019/10/23
3.1K0
Nuxt.js 开发SSR(服务端渲染)Web应用

相似问题

输出css文件而不是内联

10

角度加载<style></style>标记,而不是css文件

10

重写CSS文件中的内联CSS,而不是!重要

40

而不是内联CSS

222

有没有使用<style>文件而不是css文件的情况?

217
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文