有没有办法在自由文本中转义或管理令牌?

Is there a way of escaping or managing tokens in free text?

我有这样的词法分析器语法:

lexer grammar MyGrammarLexer;

OPEN  : '{' -> pushMode (textMode);
OTHER : . -> skip ;

mode textMode ;

CLOSE : '}' -> popMode ;
TEXT : . ;

像这样的语法:

parser grammar MyGrammarParser;

options { 
  tokenVocab = MyGrammarLexer ;
}

parse : OPEN text CLOSE EOF ;

text : TEXT* ;

这很好,直到我有一个 '}' 作为 text/TEXT 的一部分。 因此,是否有管理此问题的标准方法? 我认为应该有一种方法可以像在解析的文本中使用 '\}' 一样转义它,但我找不到示例。

\} 识别为 TEXT 中的 } 字符可以正常工作。然后你将不得不考虑如何在 TEXT 中表示 \ 的问题。一个常见的答案是使用 \

但这都是你的决定。如果您愿意,可以使用 \ 以外的一些引号字符。您可以坚持十六进制转义,如在 URL 中,其中 %xx 表示其字符代码为十六进制的 xx 的字符。您可以使用 HTML 样式的实体,尽管在这种情况下您会想出自己的名字,也许 &close;。 (或者你可以只使用像 } 这样的数字实体。)

设计输入格式(或语言)的一部分包括回答这样的问题。 ANTLR 没有试图强加一个答案;它所做的只是为您提供一种机制来实施您认为合适的任何引用规则。这种机制一点也不神秘。它只包含编写您将识别的模式,并在需要时将该模式与操作相关联(例如将引用的字符插入文本)。