gpt4 book ai didi

java - 如何用树语法中的文本重写标记?

转载 作者:行者123 更新时间:2023-11-29 08:13:44 25 4
gpt4 key购买 nike

这是我的树语法:

grammar t;
options{
output = AST;
}
type
:
'NVARCHAR' -> "VARCHAR"
;

ANTLR3 3.1.3 说:

syntax error: antlr: t.g:12:5: unexpected token: 'NVARCHAR'

这是怎么回事?我从 this article 拿来的.

附言。稍后我将使用此语法以从中获取 AST。检索到 AST 后,我将遍历它并将每个标记的文本添加到某个字符串缓冲区。上面重写的想法是替换某些 token 。我正在进行语言到语言的映射(SQL 到 SQL 方言,更具体地说)。

最佳答案

请注意 Terence 开头的第一句话:“刚刚对语义规则规范语言有了一些很酷的想法……”。这就是第一个例子:一个想法。这不是有效的语法。

(至少)有两种选择:


1。立即重写 token 中的文本

grammar T;

options{
output=AST;
}

@parser::members {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRStringStream("NVARCHAR"));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.type();
}
}

type
: NVARCHAR {System.out.println("token=" + $NVARCHAR.text);}
;

NVARCHAR
: 'NVARCHAR' {setText("VARCHAR");}
;

但这只会调整text,不会调整 token 的type,它仍然是NVARCHAR 类型。


2。使用虚构的标记:

grammar T;

options{
output=AST;
}

tokens {
VARCHAR='VARCHAR';
}

@parser::members {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRStringStream("NVARCHAR"));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.type();
}
}

type
: NVARCHAR -> VARCHAR
;

NVARCHAR
: 'NVARCHAR'
;

它改变了 token 的text type


如您所见,在两个演示中,token=VARCHAR 都被打印到控制台:

bart@hades:~/Programming/ANTLR/Demos/T$ java -cp antlr-3.3.jar org.antlr.Tool T.gbart@hades:~/Programming/ANTLR/Demos/T$ javac -cp antlr-3.3.jar *.javabart@hades:~/Programming/ANTLR/Demos/T$ java -cp .:antlr-3.3.jar TParser token=VARCHAR

关于java - 如何用树语法中的文本重写标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6180852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com