作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的树语法:
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 开头的第一句话:“刚刚对语义规则规范语言有了一些很酷的想法……”。这就是第一个例子:一个想法。这不是有效的语法。
(至少)有两种选择:
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
类型。
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/
我是一名优秀的程序员,十分优秀!