Parsing ANTLR4:如何在不将语法绑定到特定目标语言的情况下修改标记?

Parsing ANTLR4:如何在不将语法绑定到特定目标语言的情况下修改标记?,parsing,antlr,token,antlr4,lexer,Parsing,Antlr,Token,Antlr4,Lexer,如果输入字符串为: “你好” 我希望lexer向解析器发送此令牌: “你好” 使用令牌类型字符串 如果输入字符串为: “你好” 我希望lexer向解析器发送此令牌: “你好” 使用令牌类型字符串 也就是说,不管字符串分隔符是什么,我希望lexer向解析器发送由双引号(“)和标记类型字符串分隔的标记 而且,我不想把语法与特定的目标语言联系起来 在ANTLR4中有没有实现这一点的方法?使用语义谓词是否将语法与Java联系起来?语义谓词是用特定的编程语言表示的,因此语义谓词是不可接受的方法。使用->t

如果输入字符串为:

“你好”

我希望lexer向解析器发送此令牌:

“你好”

使用令牌类型字符串

如果输入字符串为:

“你好”

我希望lexer向解析器发送此令牌:

“你好”

使用令牌类型字符串

也就是说,不管字符串分隔符是什么,我希望lexer向解析器发送由双引号(“)和标记类型字符串分隔的标记

而且,我不想把语法与特定的目标语言联系起来


在ANTLR4中有没有实现这一点的方法?

使用语义谓词是否将语法与Java联系起来?语义谓词是用特定的编程语言表示的,因此语义谓词是不可接受的方法。使用
->type(STRING);
在lexer规则的末尾,您可以指定令牌类型。但是,对于
'
/
问题,不知道。可能使用语法规则来匹配
SQUOTE ID SQUOTE
DQUOTE ID DQUOTE
。。。但是您将丢失字符串标记类型。使用lexer模式跳过引号,您可以发送字符串的未引号内容,如果需要,将其留给解析器添加双引号。我不知道如何在不使用特定于语言的代码的情况下用双引号替换单引号,但我也不清楚为什么您希望解析器看到双引号。在许多实际用例中,您希望lexer在将令牌发送到解析器之前对其进行小的调整。我的例子只是想用一种简单易懂的方式来说明这些现实世界的问题。另外,我不希望语法与特定的编程语言绑定。