2016-01-27 1 views
2

Я создаю файл lexer.l, который работает как предполагалось, за исключением одной части. У меня есть правило:Регуляция регулярных выражений на escape-последовательностях с lex

[\(\*.*\*\)] {}

, который я хочу сделать это так, когда я сталкиваюсь (* this is a test *) в файле, я просто ничего не делать с ним. Однако когда я забегаю lex lexer.l, я получаю предупреждение по строкам с правилами \(, \* и \), заявляя, что они никогда не будут выполнены. Поэтому, я думаю, мой вопрос в том, почему [\(\*.*\*\)] {} вмешиваться в \( и другие? Как я могу поймать (* this is a test *)?

+1

Обратите внимание, что '(* вы будете *) иметь проблемы (* с этим *)', так как ваше регулярное выражение будет захватывать все: от '(* you' до' this *) '. –

+1

@WashingtonGuedes Я сомневаюсь, что lex поддерживает ленивые кванторы ... –

+0

@WashingtonGuedes спасибо, избавление от скобок, безусловно, является решением. почему '?'? –

ответ

0

Языки с синтаксисом комментариев (*…*) обычно допускают вложенные комментарии, а вложенные комментарии не могут быть легко распознаны (f) lex, потому что для вложенности требуется контекстная грамматика, а лексический сканер реализует только обычные языки.

Если ваши комментарии не гнездятся (так что (* something (* else *) является комментарием, а не префикс более длинного комментария), то вы можете использовать регулярное выражение

[(][*][^*]*[*]+([^*)][^*]*[*]+)*[)] 

Если вам требуется вложенные комментарии, вы можно использовать условия пуска и стек (или имитацию стека, как показано ниже):

%x SC_COMMENT 

%% 
    int comment_nesting = 0; 

"(*"    { BEGIN(SC_COMMENT); } 
<SC_COMMENT>{ 
    "(*"   { ++comment_nesting; } 
    "*"+")"  { if (comment_nesting) --comment_nesting; 
        else BEGIN(INITIAL); } 
    "*"+   ; 
    [^(*\n]+  ; 
    [(]   ; 
    \n    ; 
} 

Этот фрагмент был взят из this answer, с небольшой корректировкой, потому что ответ распознает вложенные /*…*/ комментарии. Там появляется более полное объяснение кода.