Есть ли способ избежать или управлять токенами в свободном тексте? - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть грамматика лексера, как это:

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* ;

Что хорошо, пока у меня не будет '}' как часть текста/ТЕКСТ. Поэтому существует ли стандартный способ управления этим? Я думаю, что должен быть способ избежать этого, например, иметь '\}' в разобранном тексте, но я не могу найти пример.

1 Ответ

1 голос
/ 08 ноября 2019

Распознавание \} как символа } внутри TEXT будет работать нормально. Таким образом, вам придется рассмотреть вопрос о том, как вы представляете \ внутри TEXT. Распространенный ответ - использовать \\.

Но это все ваше решение. Вы можете использовать какой-либо символ цитирования, отличный от \, если хотите. Вы можете настаивать на экранировании в шестнадцатеричном формате, как в URL, где %xx представляет символ, код символа которого xx в шестнадцатеричном формате. Вы можете использовать сущности в стиле HTML, хотя в этом случае вам придётся придумывать собственное имя, например &close;. (Или вы можете просто использовать числовую сущность, такую ​​как }.)

Часть разработки формата ввода (или языка) состоит из ответов на подобные вопросы. ANTLR не пытается навязать ответ;все, что он делает - это предоставляет вам механизм для реализации любого правила цитирования, которое вы считаете подходящим. Этот механизм вовсе не таинственный;он просто состоит из написания шаблона, который вы узнаете, и связывания этого шаблона с действием, если это необходимо (например, вставка символа в кавычках в текст).

...