有没有办法在自由文本中转义或管理令牌?
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 没有试图强加一个答案;它所做的只是为您提供一种机制来实施您认为合适的任何引用规则。这种机制一点也不神秘。它只包含编写您将识别的模式,并在需要时将该模式与操作相关联(例如将引用的字符插入文本)。
我有这样的词法分析器语法:
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 没有试图强加一个答案;它所做的只是为您提供一种机制来实施您认为合适的任何引用规则。这种机制一点也不神秘。它只包含编写您将识别的模式,并在需要时将该模式与操作相关联(例如将引用的字符插入文本)。