У меня проблемы с обработкой пробелов. В следующем отрывке грамматики я настроил лексический анализатор так, чтобы синтаксический анализатор пропускал пробелы:
ENTITY_VAR
: 'user'
| 'resource'
;
INT : DIGIT+ | '-' DIGIT+ ;
ID : LETTER (LETTER | DIGIT | SPECIAL)* ;
ENTITY_ID : '__' ENTITY_VAR ('_w_' ID)?;
NEWLINE : '\r'? '\n';
WS : [ \t\r\n]+ -> skip; // skip spaces, tabs, newlines
fragment LETTER : [a-zA-Z];
fragment DIGIT : [0-9];
fragment SPECIAL : ('_' | '#' );
Проблема в том, что я хотел бы сопоставить имена переменных в форме ENTITY_ID
, чтобы в сопоставленной строке не было пробелов. Было бы достаточно написать его как правило лексера, как я сделал здесь, но дело в том, что я хотел бы сделать это с помощью правила синтаксического анализатора, потому что я хочу иметь прямой доступ к этим двум токенам ENTITY_VAR
и ID
индивидуально из мой код, а не сжимать их обратно в единый токен ENTITY_ID
.
Есть идеи, пожалуйста? В принципе, любое решение, которое позволяло бы мне обращаться напрямую к ENTITY_VAR
и ID
, подойдет мне, оставив ENTITY_ID
как правило лексера или переместив его в синтаксический анализатор.
'__'
, вы переключаете режимы, в которых не пропускаете пробелы? - person Bart Kiers   schedule 30.07.2014entityVar
таким образом, чтобы при сопоставлении с'__'
оно переключалось в режим, в котором правило лексераWS
отключено? - person Riccardo T.   schedule 30.07.2014entityId
, а неVar
- person Riccardo T.   schedule 30.07.2014'__'
, он будет переключать режимы, независимо от того, существует ли правило парсера, которое фактически использует токен'__'
. - person Bart Kiers   schedule 30.07.2014ENTITY_ID
будет__user_w_something
, в то время как я не хотел бы анализировать__user _w_something
или любые другие варианты, содержащие пробелы. - person Riccardo T.   schedule 31.07.2014ENTITY_ID
: это может бытьENTITY_VAR
, а такжеID
. - person Riccardo T.   schedule 31.07.2014antlr4
- person Dinesh   schedule 22.09.2017