如何用树语法中的文本重写标记?
这是我的树语法:
grammar t;
options{
output = AST;
}
type
:
'NVARCHAR' -> "VARCHAR"
;
ANTLR3 3.1.3 说:
syntax error: antlr: t.g:12:5: unexpected token: 'NVARCHAR'
这里出了什么问题?我取自这篇文章。
附注我稍后会使用这个语法来从中得到 AST。一旦检索到 AST,我就会遍历它并将每个标记的文本添加到某个字符串缓冲区。上面重写的思路就是替换掉某些token。我正在做语言到语言的映射(更具体地说,是 SQL 到 SQL 方言)。
This is my tree grammar:
grammar t;
options{
output = AST;
}
type
:
'NVARCHAR' -> "VARCHAR"
;
ANTLR3 3.1.3 says:
syntax error: antlr: t.g:12:5: unexpected token: 'NVARCHAR'
What's wrong here? I took it from this article.
ps. I'm using this grammar later in order to get AST out of it. Once the AST is retrieved I'm walking through it and add every token's text to some string buffer. The idea of the rewriting above is to replace certain tokens. I'm doing language-to-language mapping (SQL to SQL dialect, to be more specific).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
请注意第一句话 Terence 开头:“只是对语义规则规范语言有一些很酷的想法......”。这就是第一个例子:一个想法。这不是有效的语法。
(至少)有两个选项供您选择:
1. 立即重写令牌中的文本
但这只会调整令牌的
文本
,而不是令牌的类型
,令牌仍然存在NVARCHAR
类型。2. 使用虚构的令牌:
它会更改令牌的
text
和type
。正如您所看到的,在这两个演示中,
token=VARCHAR
都被打印到控制台:Note the first sentence Terence starts with: "just had some cool ideas about a semantic rule specification language...". That's what the first example is: an idea. It's not valid syntax.
There are (at least) two options for you:
1. rewrite the text in the token immediately
But this only adjusts the
text
, not thetype
of the token, which remains aNVARCHAR
type.2. use an imaginary token:
which changes the
text
andtype
of the token.As you can see, with both demos,
token=VARCHAR
is being printed to the console:在antlr4中,替换文本和类型可以通过
type
操作来实现:in antlr4 replacing text and type can be achieved with the
type
action: