Antlr 如何编写引用字符的lexer规则?

Antlr 如何编写引用字符的lexer规则?,antlr,antlr4,Antlr,Antlr4,我想创建一个lexer规则,它可以读取定义自己的分隔符的字符串文字(特别是Oracle引号分隔的字符串): 哪里有用作分隔符,但理论上可以是任何字符 有没有可能通过lexer规则来实现这一点,而不引入对给定语言目标的依赖 有没有可能通过lexer规则来实现这一点,而不引入对给定语言目标的依赖 不,这样的事情需要依赖于目标的代码 如果您或阅读本问答的其他人想知道如何使用目标代码来实现这一点,下面是一个快速演示: lexer语法; @成员{ 前置布尔值(字符串文本){ 对于(int i=0;iq'(

我想创建一个lexer规则,它可以读取定义自己的分隔符的字符串文字(特别是Oracle引号分隔的字符串):

哪里有
用作分隔符,但理论上可以是任何字符

有没有可能通过lexer规则来实现这一点,而不引入对给定语言目标的依赖

有没有可能通过lexer规则来实现这一点,而不引入对给定语言目标的依赖

不,这样的事情需要依赖于目标的代码

如果您或阅读本问答的其他人想知道如何使用目标代码来实现这一点,下面是一个快速演示:

lexer语法;
@成员{
前置布尔值(字符串文本){
对于(int i=0;i 跳过
;
片段引用文本
:“[”({!前面(“]”)}?)*']
|“{”({!前面(“}”)}?)*'}”
|“%s\n”,token.getText();
}
}
System.out.println();
}
公共静态void main(字符串[]args)引发异常{
测试(“foo q'!可以包含“单引号”!“条”的我的字符串”);
测试(“fooq”(我的字符串可以包含“单引号”)“bar”);
测试(“foo”我的字符串,可以包含“单引号”栏);
}
}
将打印:

input:'foo q'!可以包含“单引号”的我的字符串!'bar`
令牌:->q'!可以包含“单引号”的我的字符串!'
输入:`fooq'(我的字符串可以包含'single quotes')栏`
令牌:->q'(可以包含“单引号”的我的字符串)
输入:`foo'我的字符串,可以包含“单引号”栏`
令牌:->“我的字符串,可以包含”“单引号”
备选方案中的

|  .  ( {!ahead(getText().charAt(0) + "'")}? . )*  .
可能有点过于宽松,但可以通过将其替换为否定字符集或常规字符集来进行调整

|  .  ( {!ahead(getText().charAt(0) + "'")}? . )*  .