当前位置: 首页 > 知识库问答 >
问题:

了解ANTLR4令牌

南门飞
2023-03-14
grammar Tst;

init: A token=('+'|'-') B;

A: .+?;
B: .+?;
ADD: '+';
SUB: '-';
public static class InitContext extends ParserRuleContext {
        public Token token;       //<---------------------------- HERE
        public TerminalNode A() { return getToken(TstParser.A, 0); }
        public TerminalNode B() { return getToken(TstParser.B, 0); }
        public InitContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }
        @Override public int getRuleIndex() { return RULE_init; }
        @Override
        public void enterRule(ParseTreeListener listener) {
            if ( listener instanceof TstListener ) ((TstListener)listener).enterInit(this);
        }
        @Override
        public void exitRule(ParseTreeListener listener) {
            if ( listener instanceof TstListener ) ((TstListener)listener).exitInit(this);
        }
    }
public static final int A=1, B=2, ADD=3, SUB=4;

我们如何才能让他们识别lexer规则?所有ABAdd规则都可能与'+'匹配。那么我在测试它的时候应该使用什么类型。

我的意思是:

TstParser.InitContext ctx;
//...
ctx.token.getType() == //What type?
                       //TstParse.A
                       //TstParse.B
                       //or
                       //TstParse.ADD?

一般来说,我想了解antlr4如何知道令牌的类型?

共有1个答案

王棋
2023-03-14

我将尝试向您介绍解析的过程。这一过程分为两个阶段。Lexer部分(创建令牌的地方)和解析器部分。(这就是解析表达式的来源--如果我们在讨论一般的解析,就不是很精确了)。在这个过程中,您所要做的就是理解输入,同时可能创建一个输入的模型。为了减轻这种情况,工作通常被分成更小的步骤。更容易理解主要表示为“单词”的符号(比字符更大的输入元素)。(关键字、变量、字面要精确)。

因此,您所做的第一步是将字符流形式的输入预处理为令牌。关于令牌,你所能说的就是与它相连的是什么价值,以及它是什么样的令牌。例如,在非常简单的计算器输入“2+3*9”中,“2”表示值2的数字标记,“+”表示值“+”的运算符标记,等等。lexer部分的结果是令牌流。可以想象,lexer和解析器规则非常相似。第一步使用字符,第二步使用令牌。

关于ANTLR(许多其他生成器的工作原理相同),有一个关于LEXER的重要规则。不能对不同的令牌使用相同的规则。因此,您插入的语法将无法工作,因为lexer部分在A和B之间不能不同。您可以只对双方使用相同的令牌名称。你以后会处理的。

 类似资料:
  • 请注意,上面输出的第二行是我粘贴到grun中的数据,然后单击enter并单击Control+D。 在这方面的任何帮助都将非常感谢,一直在敲我的头在这一点上的键盘现在。

  • 我正在为一种语言编写一个编译器,作为大学使用ANTLR4的项目。我使用Java编写了这个编译器,并采用了Visitor模式,当我到达测试阶段时,我注意到ANTLR忽略了我的部分代码,并生成了它不应该生成的错误。 语法: 以下是我的主要观点: 当我运行Main时,它显示: 第1行:0不匹配的输入'import'应为{(',INT,FLOAT,STRING,IDF} 我的语法有什么地方错了吗?如果没有

  • 我是一个Antlr4新手,有一个相对简单的语法问题。语法在末尾的底部给出。(这是一个语法片段,用于分析生物序列变体的描述)。 在下面的单元测试中,我试图解析字符串。 这里出了什么问题?我在哪里可以学习如何解决这个问题?

  • 我需要编写一个Java程序,使用,在给定一个源文件和一个方法的情况下,可以计算变量、运算符、标点符号和保留字的数量。 如何使用根据标记的类型对其计数?

  • 我在试图理解令牌在Firebase存储中是如何工作的。 每当我的web应用程序将图像上传到FS,它就会在其公共URL中添加一个令牌。问题是,每当您将同一图像文件上传到web应用程序的另一个部分时,您似乎没有得到另一个文件,而是得到了已经上传的文件url的不同令牌,从而为以前注册的图像显示呈现403错误。 有办法解决这个吗? 如果用户重复这个过程,并在应用程序的另一个部分上传相同的picture.j

  • 如何检索找到的标记映射(例如),以便验证文本是否已正确映射到标记?