строка рекурсии лексер токен - PullRequest
2 голосов
/ 31 марта 2010

Как мне построить токен в лексере, который может обрабатывать рекурсию внутри, как эта строка:

${*anything*${*anything*}*anything*}

Ответы [ 2 ]

2 голосов
/ 01 апреля 2010

Да, вы можете использовать рекурсию внутри правил лексера.

Возьмите следующий пример:

${a ${b} ${c ${ddd} c} a}

, который будет правильно проанализирован следующей грамматикой:

parse
  : DollarVar
  ;

DollarVar
  : '${' (DollarVar | EscapeSequence | ~Special)+ '}'
  ;

fragment 
Special
  :  '\\' | '$' | '{' | '}'
  ;

fragment
EscapeSequence
  :  '\\' Special
  ;

как показывает переводчик внутри ANTLRWorks:

альтернативный текст http://img185.imageshack.us/img185/5471/recq.png

0 голосов
/ 31 марта 2010

Лексеры ANTLR поддерживают рекурсию, как @BartK умело указывает в своем посте, но вы увидите только один токен в парсере. Если вам нужно интерпретировать различные части в этом токене, вы, вероятно, захотите обработать его внутри синтаксического анализатора.

IMO, вам лучше сделать что-нибудь в парсере:

variable: DOLLAR LBRACE id variable id RBRACE;

Сделав что-то подобное, вы увидите все необходимые части и сможете построить AST или иным образом обработать.

...