Antlr 忽略字符串文字匹配中的前导引号和尾随引号

Antlr 忽略字符串文字匹配中的前导引号和尾随引号,antlr,antlr4,antlr4cs,Antlr,Antlr4,Antlr4cs,我想将'Foo'匹配为Foo,而不是'Foo' 我有以下lexer规则: STRING_LITERAL : '\'' ( ~'\'' | '\'\'' )* '\'' ; 但它似乎与引文相符 我的访客是这样的: public override IFilterExpression VisitLiteral_value(MagicHubFilterParser.Literal_valueContext context) { return MakeExpression(context.G

我想将'Foo'匹配为
Foo
,而不是
'Foo'

我有以下lexer规则:

STRING_LITERAL
 : '\'' ( ~'\'' | '\'\'' )* '\''
 ;
但它似乎与引文相符

我的访客是这样的:

public override IFilterExpression VisitLiteral_value(MagicHubFilterParser.Literal_valueContext context) {
    return MakeExpression(context.GetText());
}
我知道我可以在这一点上修剪它,但我怀疑如果可能的话,在lexer级别处理它会更快更干净


做这件事最好的方法是什么?

正如@CoronA所建议的,在访客中做可能更规范。但是,我确实找到了使用解析规则的方法:

stringBody : ( ~'\'' | '\'\'' )*;
stringLiteral
  : '\'' body=stringBody '\''
  ;

我认为在访客中处理它是很常见的。你不仅要修剪它,还要把它修剪干净。但是,您也可以在lexer中通过在识别后面的标记上调用
setText
来执行这些操作。我最终发现,如果我将其创建为解析器规则,那么我可以作为子节点访问字符串的中心。但这似乎是错误的。从lexer执行此操作是否有任何性能优势,而不仅仅是在访问者中进行修剪?然而,解析器规则解决方案非常少见(并且可能没有性能)。如果您需要访客执行其他任务,则性能应具有可比性。如果访问者什么也不做,最好在其他地方进行修剪(但我会选择解析器,而不是词法分析器)。如果要在错误消息中报告准确的行号,在lexer中进行修剪会产生问题。