Estou tentando entender compilação e interpretação, passo a passo, descobrindo uma imagem total. Por isso, fiz uma pergunta ao ler http://www.cs.man.ac.uk/~pjj/farrell/comp3.html este artigo
Diz :
O próximo estágio do compilador é chamado de analisador. Esta parte do compilador possui um entendimento da gramática da linguagem. Ele é responsável por identificar erros de sintaxe e por traduzir um programa sem erros em estruturas de dados internas que podem ser interpretadas ou gravadas em outro idioma.
Mas não consegui descobrir como o tokenizer pode tokenizar adequadamente o fluxo especificado que possui o erro de sintaxe.
Ele deve ficar preso ou fornecer informações erradas ao analisador. Quero dizer, o tokenizing também não é um tipo de tradutor?
Então, como ele simplesmente supera as linhas lexicais de código corrompidas ao usar token.
Há um exemplo de token dentro do link acima no cabeçalho do Tokenizer .
Pelo que entendi, parece que a forma do token, se houver algo errado no token de código, também estará corrompido.
Poderia, por favor, esclarecer meu mal-entendido?
and
ou&&
ou qualquer outra coisa. É (principalmente) separado e diferente da análise. A otimização (se houver) é um efeito colateral quase acidental.Você normalmente espera que a maioria dos erros de sintaxe venha do analisador, não do lexer.
O lexer geraria um erro se (e principalmente somente se) houver algo na entrada que não possa ser tokenizado. Em muitos idiomas, no entanto, quase qualquer sequência de caracteres pode ser transformada em algum tipo de tokens; portanto, os erros aqui são bastante incomuns.
O analisador gerará um erro se a entrada contiver tokens válidos, mas esses tokens não estiverem organizados para formar declarações / expressões válidas no idioma de destino. Isso é muito mais comum como regra.
fonte
O tokenizador apenas divide o fluxo de caracteres em tokens. No tokenizer POV, isso é completamente válido:
e traduz para algo como:
["1", MULTIPLY, MULTIPLY, "1"]
Apenas o analisador pode rejeitar essas expressões - ele sabe que o operador multiplicador não pode seguir outro operador multiplicador. Por exemplo, em JavaScript, isso produz:Existem erros que podem ser detectados pelo tokenizer. Por exemplo literais inacabadas string:
"abc
ou números inválidos:0x0abcdefg
. Eles ainda podem ser relatados como erros de sintaxe:Observe, no entanto, o token não foi reconhecido e é relatado como
ILLEGAL
.fonte