Antlr4 ANTLR 4:动态令牌

Antlr4 ANTLR 4:动态令牌,antlr4,Antlr4,鉴于: 我想知道如何在运行时将START\u DELIM和END\u DELIM更改为例如 有人知道如何在ANTLR 4中做到这一点吗 谢谢。有一种方法,但您需要将语法与目标语言联系起来(到目前为止,唯一的目标语言是Java) 下面是一个快速演示(我加入了一些注释以澄清问题): 语法T; @lexer::成员{ //一些默认值 私有字符串start=“”; 公共TLexer(字符流输入、字符串开始、字符串结束){ 这(输入); this.start=start; this.end=end; }

鉴于:

我想知道如何在运行时将
START\u DELIM
END\u DELIM
更改为例如

有人知道如何在ANTLR 4中做到这一点吗


谢谢。

有一种方法,但您需要将语法与目标语言联系起来(到目前为止,唯一的目标语言是Java)

下面是一个快速演示(我加入了一些注释以澄清问题):

语法T;
@lexer::成员{
//一些默认值
私有字符串start=“”;
公共TLexer(字符流输入、字符串开始、字符串结束){
这(输入);
this.start=start;
this.end=end;
}
布尔tryToken(字符串文本){
//查看CharStream中的'text'是否在前面。
对于(int i=0;i跳过
;
{…}?
是一个语义谓词。见:

下面是一个小测试类:

import org.antlr.v4.runtime.*;
导入org.antlr.v4.runtime.tree.*;
公共班机{
私有静态无效测试(TLexer lexer)引发异常{
TParser parser=newtparser(newcommontokenstream(lexer));
ParseTree=parser.parse();
System.out.println(tree.toStringTree(解析器));
}
公共静态void main(字符串[]args)引发异常{
//使用默认的开始和结束进行测试。
测试(新的TLexer(新的AntlInputStream(“>”));
//使用自定义的开始和结束进行测试。
测试(新的TLexer(新的AntlInputStream(“”“”));
}
}
按如下方式运行演示:

*尼克斯 窗户 您将看到以下内容被打印到控制台:

(解析>)
(解析)
grammar Hbs;

var: START_DELIM ID END_DELIM;

START_DELIM: '{{';

END_DELIM: '}}';
java -jar antlr-4.0-complete.jar T.g4
javac -cp .:antlr-4.0-complete.jar *.java
java -cp .:antlr-4.0-complete.jar Main
java -jar antlr-4.0-complete.jar T.g4
javac -cp .;antlr-4.0-complete.jar *.java
java -cp .;antlr-4.0-complete.jar Main