ANTLR: Como escrever uma regra para fazer cumprir caractere de continuação de linha ao escrever uma string?

votos
1

Eu quero escrever uma regra para analisar uma string dentro de aspas. Quero permitir que qualquer personagem, com a única condição de que deve haver um personagem \ linha de continuação, ao dividir a string em várias linhas.

Exemplo:

variable = first line \n second line \
            still second line \n \
            third line

Se o caractere de continuação não é encontrado antes de um caractere de nova linha for encontrado, eu quero o analisador para vomitar.

Minha regra atual é a seguinte:

STRING  : '' (ESC|.)*? '';
fragment ESC : '\\' [btnr\\] ;

Então, eu estou permitindo que a corda para conter qualquer caractere, incluindo bando de seqüências de escape. Mas eu não estou realmente impor essa caractere de continuação de linha \ é uma necessidade para texto divisão.

Como posso fazer a gramática impor essa regra?

Publicado 19/10/2016 em 16:16
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Solução

fragment ESCAPE
    : '\\' .
    ;
STRING
    : '"' (ESCAPE | ~[\n"])* '"'
    ;

Explicação

Fragmento ESCAPEirá coincidir com caracteres de escape (especialmente barra invertida e um caractere de nova linha agindo como um sinal de continuação).

Token STRINGirá corresponder dentro de aspas duplas:

  • Caracteres de escape (fragmento ESCAPE)
  • Tudo, exceto nova linha e entre aspas duplas.
Respondeu 19/10/2016 em 19:03
fonte usuário

votos
1

Mesmo que já existe uma resposta aceita deixe-me colocar em meu 2cents. Eu recomendo fortemente não para lidar com este tipo de erro em uma regra lexer. A razão é que você não será capaz de dar ao usuário uma boa mensagem de erro. Em primeiro lugar, os erros lexer normalmente não são relatados separadamente em ANTLR4, eles aparecem como acompanhamento erros do analisador. Em segundo lugar, o erro produzido (provavelmente algo como: "não alt viável em \ n") é tudo, mas útil.

A melhor solução é aceitar ambas as variantes (linebreak com ou w / o escape) e fazer uma verificação semântica depois. Então você sabe exatamente o que está errado e o usuário pode dizer o que o seu realmente esperar.

Respondeu 20/10/2016 em 06:50
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more