我有一个像这样的lexer语法:
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
中表示的问题。一个常见的答案是使用
\
。
但这都是你的决定。如果你愿意的话,你可以使用以外的引用字符。你可以坚持使用十六进制转义,比如在URL中,
%xx
表示字符代码为十六进制xx
的字符。您可以使用HTML样式的实体,尽管在这种情况下,您可以想出自己的名称,可能是&close;
。(或者你可以只使用像}
这样的数字实体。(
设计输入格式(或语言(的一部分包括回答这样的问题。ANTLR没有试图强加一个答案;它所做的只是为您提供一种机制来实现您认为合适的引用规则。这种机制一点也不神秘;它只包括编写一个你会识别的模式,并根据需要将该模式与一个动作关联起来(例如将引用的字符插入文本(。