有没有一种方法可以在自由文本中转义或管理令牌?

时间:2019-11-07 19:50:05

标签: parsing antlr4

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

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的一部分之前,这还可以。 因此,有一种标准的方法来管理此问题吗? 我认为应该有一种转义的方式,例如在解析的文本中包含'\}',但我找不到示例。

1 个答案:

答案 0 :(得分:1)

\}识别为}内的TEXT字符会很好。因此,您必须考虑在\中如何表示TEXT的问题。常见的答案是使用\\

但这就是您的全部决定。如果需要,可以使用\以外的其他引号字符。您可以坚持使用十六进制转义符,例如在URL中,其中%xx代表字符代码为xx的十六进制字符。您可以使用HTML样式的实体,尽管在这种情况下,您需要考虑自己的名称,也许是&close;。 (或者您可以只使用}之类的数字实体。)

设计输入格式(或语言)的一部分包括回答这样的问题。 ANTLR不会强加任何答案。它所做的就是为您提供一种机制,以实施您认为合适的任何报价规则。这种机制一点也不神秘;它仅包含编写您将要识别的模式,以及在需要时将该模式与操作相关联(例如,将带引号的字符插入TEXT)。