Operador léxico “não ganancioso”

Por omissão, a análise léxica é “gananciosa”.

Isto é, os tokens são gerados com o maior tamanho possível.

Esta particularidade é em geral a desejada, mas pode trazer problemas em alguns casos.

Por exemplo, se quisermos reconhecer um string:

  • STRING: ' " ' .* ' " ';

(No analisador léxico o ponto (.) reconhece qualquer carácter excepto o EOF.)

Esta regra não funciona, porque, uma vez reconhecido o primeiro carácter ", o analisador léxico vai reconhecer todos os caracteres como pertencendo ao STRING até ao último carácter ".

Este problema resolve-se com o operador non-greedy:

  • STRING: ' " ' .*? ' " '; // match all chars until a " appears !

Last updated