2015-03-06 4 views
0

Я использую antlr4, и я пытаюсь сделать парсер для Matlab. Одна из главных проблем заключается в том, что комментарии и транспонирование используют одиночные кавычки. То, что я думал о решении, заключалось в том, чтобы определить правило lexer STRING несколько следующим образом:ANTLR4 Отрицательное обходное решение?

(if previous token is not ')','}',']' or [a-zA-Z0-9]) than match '\'' (ESC_SEQ | ~('\\'|'\''|'\r'|'\n'))* '\' '(но обратите внимание, что я не хочу использовать предыдущий токен, если это правда).

Кто-нибудь знает обходной путь этой проблемы, поскольку он не поддерживает отрицательные образы?

ответ

1

Вы можете сделать отрицательный lookahead в ANTLR4, используя _input.LA(-1) (на Java, см. how to resolve simple ambiguity или ANTLR4 negative lookahead in lexer).

Вы также можете использовать режим lexer для работы с подобными вещами, но ваш лексер должен быть определен в собственном файле. Идея состоит в том, чтобы перейти от состояния, которое может соответствовать некоторым токенам другому, которые могут соответствовать новым.

Вот пример из ANTLR4 lexer documentation:

// Default "mode": Everything OUTSIDE of a tag 
COMMENT : '<!--' .*? '-->' ; 
CDATA : '<![CDATA[' .*? ']]>' ; 
OPEN : '<'      -> pushMode(INSIDE) ; 
... 
XMLDeclOpen : '<?xml' S  -> pushMode(INSIDE) ; 
... 

// ----------------- Everything INSIDE of a tag ------------------ --- 
mode INSIDE; 
CLOSE : '>'   -> popMode ; 
SPECIAL_CLOSE: '?>' -> popMode ; // close <?xml...?> 
SLASH_CLOSE : '/>' -> popMode ; 
+0

Вы знаете, в любом случае, чтобы указать диапазон в семантическом предиката, например, {_input.LA (-1)! = [a-zA-Z0-9]}? –

+0

Этот код непосредственно помещается в сгенерированный лексер (код напрямую помещается в java/your_target_language в сгенерированный лексер), поэтому я не думаю, что вы не можете использовать прямой диапазон. Однако, поскольку это Java (или ваш целевой язык), который скопирован в вашем лексере, вы можете использовать 'matches (...)' или эквивалентные функции. Однако в вашем случае использование режимов lexer должно быть более подходящим. –

Смежные вопросы