Como posso analisar isso corretamente com o espírito?
-
19-08-2019 - |
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?
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)