Pergunta

A minha situação:. Eu sou novo para o Espírito, eu tenho que usar VC6 e estou, portanto, utilizando Espírito 1.6.4

Eu tenho uma linha parecida com esta:

//The Description;DESCRIPTION;;

Eu quero colocar o DESCRIPTION texto em uma string Se a linha começa com //The Description;.

Eu tenho algo que funciona, mas parece não que elegante para mim:

vector<char> vDescription; // std::string doesn't work due to missing ::clear() in VC6's STL implementation
if(parse(chars,
    // Begin grammar
    (
       as_lower_d["//the description;"]
    >> (+~ch_p(';'))[assign(vDescription)]
    ),
    // End grammar
    space_p).hit)
{
    const string desc(vDescription.begin(), vDescription.end());
}

Eu prefiro muito mais como para atribuir todos os caracteres imprimíveis para o próximo ';' mas o seguinte não funcionará porque parse(...).hit == false

parse(chars,
        // Begin grammar
        (
           as_lower_d["//the description;"]
        >> (+print_p)[assign(vDescription)]
        >> ';'
        ),
        // End grammar
        space_p).hit)

Como posso fazê-lo bater?

Foi útil?

Solução

Você pode tentar usar confix_p :

confix_p(as_lower_d["//the description;"],
         (+print_p)[assign(vDescription)],
         ch_p(';')
        )

Deve ser equivalente a de Fred resposta .

A razão o seu código de falha é porque print_p é gananciosos . O analisador +print_p irá consumir caracteres até encontrar a extremidade da entrada ou um carácter não-impresso. Ponto e vírgula é de impressão, de modo reivindicações print_p TI. Sua entrada fica exausto, a variável é atribuído, eo jogo não -. Não há mais nada para o último ponto e vírgula do seu analisador para corresponder

A resposta de Fred constrói um novo analisador, (print_p - ';'), que combina com tudo print_p faz, exceto por ponto e vírgula. "Match tudo, exceto X , e em seguida, corresponder X " é um padrão comum, de modo confix_p é fornecido como um atalho para a construção desse tipo de parser. A documentação sugere usá-lo para analisar C ou Pascal de estilo comentários, mas isso não é necessário.

Para o seu código para o trabalho, Espírito seria necessário reconhecer que o print_p gananciosos combinava muito e, em seguida, BackTrack para permitir correspondência menos. Mas, embora Espírito vai voltar atrás, não vai recuar para o "meio" do que um sub-analisador de outra forma, corresponder com avidez. Ele vai recuar para o próximo "ponto de escolha", mas sua gramática não tem qualquer. Consulte retrocesso exaustiva e gananciosos RD na documentação do Espírito.

Outras dicas

Você não está recebendo um sucesso porque ';' é acompanhado por print_p. Tente isto:

parse(chars,
    // Begin grammar
    (
       as_lower_d["//the description;"]
    >> (+(print_p-';'))[assign(vDescription)]
    >> ';'
    ),
    // End grammar
    space_p).hit)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top