Pergunta

Eu estou escrevendo um lexer jFlex para Lua, e eu estou tendo problemas conceber uma expressão regular para corresponder a uma parte específica da especificação de linguagem:

cordas

literais também podem ser definidas usando um longo formato fechado por longos parênteses. Nós definimos um suporte longo de nível abertura n como uma abertura colchete seguido de n sinais de igual seguido por outro abre colchete. Assim, um suporte longo de nível 0 de abertura é escrito como [[, um suporte longo de um nível de abertura é escrito como [= [, e assim por diante. Um suporte de longo fecho é definido de modo semelhante; por exemplo, um fecho de colchete longo de nível 4 é escrito como] ====]. Uma cadeia longa começa com uma abertura de suporte longo de qualquer nível e termina no primeiro sistema de fecho de colchete longo do mesmo nível. Literais expressos desta forma pode ser executado por várias linhas, não interprete quaisquer sequências de escape, e ignorar longos suportes de qualquer outro nível. Eles podem conter qualquer coisa, exceto um colchete de fechamento do nível adequado.

Em poucas palavras, eu estou tentando criar uma expressão regular que irá corresponder a um longo parêntese de abertura, o conteúdo da corda no meio, eo suporte de longa fechando. Um jogo só deve ocorrer quando o suporte de longo abertura e fechamento de suporte de longo têm o mesmo número de sinais iguais, o que pode ser zero ou mais.

Foi útil?

Solução

\[(=*)\[.*?\]\1\]

capturas \ 1 o primeiro ().

Outras dicas

Bem, eu sou tokenizing medo com expressões regulares não é bom o suficiente para esta tarefa. As expressões regulares são apenas o suficiente para não poderoso.

Não há nenhuma maneira de comparar o número de marcas '=' usando expressões regulares simples em jFlex. Perl teria um hack para que (\ 1 como sugerido acima), mas nós não estamos falando de programação Perl, mas jFlex lexer.

A solução é ir com \ [= * \ [para o token suporte esquerdo, \] = * \] para o símbolo de suporte para a direita, e em seguida na camada de cima (um analisador) comparar se eles correspondem em comprimento.

De qualquer forma, você pode olhar para read_long_string () no código fonte lua em llex.c e ver como eles fizeram isso sem o uso de expressões regulares em todos.

\[(=*)\[.*?\]\1\]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top