Estou procurando uma definição clara do que são um "tokenizer", "analisador" e "lexer" e como eles estão relacionados entre si (por exemplo, um analisador usa um tokenizador ou vice-versa)? Eu preciso criar um programa passará por arquivos de origem c / h para extrair declarações e definições de dados.
Eu tenho procurado exemplos e posso encontrar algumas informações, mas realmente estou lutando para entender os conceitos subjacentes, como regras gramaticais, analisar árvores e analisar a árvore abstrata de sintaxe e como elas se inter-relacionam. Eventualmente, esses conceitos precisam ser armazenados em um programa real, mas 1) como eles se parecem, 2) existem implementações comuns.
Eu estive pesquisando a Wikipedia sobre esses tópicos e programas como Lex e Yacc, mas nunca tendo passado por uma classe de compilador (EE major), acho difícil entender completamente o que está acontecendo.
Exemplo:
Um lexer ou tokeniser dividirá isso em tokens 'int', 'x', '=', '1', ';'.
Um analisador pegará esses tokens e os usará para entender de alguma maneira:
fonte
Eu diria que um lexer e um tokenizer são basicamente a mesma coisa, e eles esmagam o texto em suas partes componentes (os 'tokens'). O analisador interpreta os tokens usando uma gramática.
Eu não ficaria muito preocupado com o uso terminológico preciso - as pessoas costumam usar 'análise' para descrever qualquer ação de interpretação de um pedaço de texto.
fonte
( adicionando às respostas dadas )
fonte