armazenando números de linha de expressões com boost.spirit 2
-
22-09-2019 - |
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?
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