Pergunta

Estou planejando fazer um utilitário de transformação de script (para informações de diagnóstico estendido) usando o boost.spirit 2.

Embora haja suporte para informações de linha etc. Para analisar erros, como posso armazenar números de linha para expressões analisadas com sucesso com Qi?

Foi útil?

Solução

De acordo com a lista de discussão, Spirit.Classic iteradores posicionais também pode ser usado com Espírito 2.
Há também um artigo sobre um iter_pos-parser no Espírito-Blog.

Vou atualizar quando tive tempo para testar.

Outras dicas

Sei que notei a pergunta tarde, mas deixe -me acrescentar isso de qualquer maneira. Eu escrevi uma amostra de um analisador de arquivo ini em outra resposta:

Isso usa uma ação semântica 'simples' com line_pos_iterator.

Aqui está o fruto do meu trabalho: https://gist.github.com/1425972

  • Quando POSITIONINFO == 0
    • A entrada está transmitindo
    • A saída é de cordas cruas (bem, map<string, map<string, string> > para as seções)
  • Quando POSITIONINFO == 1

    • A entrada é tamponada
    • saída é textnode_t:

      struct textnode_t {
          int sline, eline, scol, ecol;
          string_t text;
      };
      

      Isso significa que o resultante map<textnode_t, map<textnode_t, textnode_t> > é capaz de relatar exatamente o que (linha, col) inicial e os pontos finais marcam os nós de texto individuais.

Aqui está uma demonstração reduzida. Para uma descrição completa e casos de teste extensos, consulte o Anser original ou o código em Github

Entrada de demonstração

[Cat1]
name1=100 #skipped

name2=200 \#not \\skipped
name3=   dhfj dhjgfd

Saída de demonstração (PositionInfo == 0)

Parse success!
[Cat1]
name1 = 100 
name2 = 200 \#not \\skipped
name3 = dhfj dhjgfd

Saída de demonstração (PositionInfo == 1)

Parse success!
[[L:1,C2 .. L1,C6:Cat1]]
[L:2,C2 .. L2,C7:name1] = [L:2,C8 .. L2,C12:100 ]
[L:6,C2 .. L6,C7:name2] = [L:6,C8 .. L6,C27:200 \#not \\skipped]
[L:7,C2 .. L7,C7:name3] = [L:7,C11 .. L7,C22:dhfj dhjgfd]

Aqui é outro artigo útil que explica como usar a exceção de que o phrase_parse Função lança.

O artigo descreve como obter mensagens de erro como esta:

Exception: parse error at file STDIN line 1 column 10
'123,42.0,a,1.4'
          ^- here
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top